{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "collapsed": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "b'\\x03'"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import struct   # 数据编码与解码工具\n",
    "struct.pack('>i',3)  # 高位字节\n",
    "struct.pack('>B',3)   # 低位字节？"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "collapsed": true
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "IOPub data rate exceeded.\n",
      "The notebook server will temporarily stop sending output\n",
      "to the client in order to avoid crashing it.\n",
      "To change this limit, set the config variable\n",
      "`--NotebookApp.iopub_data_rate_limit`.\n",
      "\n",
      "Current values:\n",
      "NotebookApp.iopub_data_rate_limit=1000000.0 (bytes/sec)\n",
      "NotebookApp.rate_limit_window=3.0 (secs)\n",
      "\n"
     ]
    }
   ],
   "source": [
    "with open('./MNIST_data/train-images-idx3-ubyte','rb') as f: # rb 读取二进制文件\n",
    "    buffer  = f.read(4*4)\n",
    "    head = struct.unpack('>iiii',buffer)\n",
    "    #print(head)\n",
    "    length = head[1]*head[2]*head[3]   #图片数*行像素*列像素\n",
    "    buffer = f.read(length)\n",
    "    print(buffer)\n",
    "    data = struct.unpack('>{}B'.format(length),buffer)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "collapsed": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(60000, 28, 28)"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import numpy as np\n",
    "imgs = np.reshape(data, (head[1], head[2], head[3]))\n",
    "imgs.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "collapsed": true
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "for i in range(3):\n",
    "    plt.imshow(imgs[i],cmap = 'gray')\n",
    "    plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "collapsed": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'__header__': b'MATLAB 5.0 MAT-file Platform: posix, Created on: Sun Mar 30 03:19:02 2014',\n",
       " '__version__': '1.0',\n",
       " '__globals__': [],\n",
       " 'mldata_descr_ordering': array([[array(['label'], dtype='<U5'), array(['data'], dtype='<U4')]],\n",
       "       dtype=object),\n",
       " 'data': array([[0, 0, 0, ..., 0, 0, 0],\n",
       "        [0, 0, 0, ..., 0, 0, 0],\n",
       "        [0, 0, 0, ..., 0, 0, 0],\n",
       "        ...,\n",
       "        [0, 0, 0, ..., 0, 0, 0],\n",
       "        [0, 0, 0, ..., 0, 0, 0],\n",
       "        [0, 0, 0, ..., 0, 0, 0]], dtype=uint8),\n",
       " 'label': array([[0., 0., 0., ..., 9., 9., 9.]])}"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import scipy.io\n",
    "mnist = scipy.io.loadmat('mnist-original.mat')\n",
    "mnist\n",
    "\n",
    "# from sklearn.datasets import fetch_openml\n",
    "# mnist = fetch_openml(\"mnist_784\",data_home='./')data_home\n",
    "# # mnist = fetch_openml('MNIST original') # , data_home='./'"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# data 为独热编码的稀疏矩阵 label 为标签\n",
    "X, y = mnist['data'], mnist['label']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "collapsed": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(70000, 784)"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X = X.T\n",
    "X.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "collapsed": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(70000,)"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y = y.T\n",
    "y = y.flatten()\n",
    "y.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "%matplotlib inline\n",
    "import matplotlib\n",
    "import matplotlib.pyplot as plt"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "collapsed": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(784,)"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "some_digit = X[1000]\n",
    "some_digitme_image = some_digit.reshape(28,28)\n",
    "some_digit.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "collapsed": true
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.imshow(some_digitme_image, cmap=matplotlib.cm.binary)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "collapsed": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.0"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y[1000]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 分测试集和训练集"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "X_train, X_test, y_train, y_test = X[:60000], X[60000:],y[:60000],y[60000:]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "    将数据洗牌，防止因顺序问题导致训练效果不好"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {
    "collapsed": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([51036, 41990, 34126, ..., 53272, 17838, 32878])"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import numpy as np\n",
    "shuffle_index = np.random.permutation(60000)\n",
    "shuffle_index"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {
    "collapsed": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[0, 0, 0, ..., 0, 0, 0],\n",
       "       [0, 0, 0, ..., 0, 0, 0],\n",
       "       [0, 0, 0, ..., 0, 0, 0],\n",
       "       ...,\n",
       "       [0, 0, 0, ..., 0, 0, 0],\n",
       "       [0, 0, 0, ..., 0, 0, 0],\n",
       "       [0, 0, 0, ..., 0, 0, 0]], dtype=uint8)"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X_train , y_train = X_train[shuffle_index], y_train[shuffle_index]\n",
    "X_train"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 训练一个二元分类器"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {
    "collapsed": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([False,  True, False, ..., False, False, False])"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 识别数字7 ，二元分类或者非7\n",
    "# 创建目标向量\n",
    "y_train_7 = (y_train == 7)\n",
    "y_test_7 = (y_test == 7) \n",
    "y_train_7"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {
    "collapsed": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[False,  True, False, ...,  True, False, False],\n",
       "       [False, False, False, ..., False, False, False],\n",
       "       [False, False, False, ..., False, False, False],\n",
       "       ...,\n",
       "       [False, False, False, ...,  True, False, False],\n",
       "       [False, False, False, ..., False, False, False],\n",
       "       [False, False,  True, ..., False, False, False]])"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y_train_7.reshape(10,-1) # 只是为了看一下"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "    SGD 梯度下降 分类器， 适合非常大的数据集，独立处理训练集数据，一次一个，适合在线学习"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {
    "collapsed": true
   },
   "outputs": [
    {
     "ename": "KeyboardInterrupt",
     "evalue": "",
     "output_type": "error",
     "traceback": [
      "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[1;31mKeyboardInterrupt\u001b[0m                         Traceback (most recent call last)",
      "\u001b[1;32m<ipython-input-19-7a1f379462bb>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m\u001b[0m\n\u001b[0;32m      2\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m      3\u001b[0m \u001b[0msgd_clf\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mSGDClassifier\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mrandom_state\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;36m42\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 4\u001b[1;33m \u001b[0msgd_clf\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mfit\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mX_train\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0my_train_7\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m      5\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m      6\u001b[0m \u001b[0msgd_clf\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mpredict\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m[\u001b[0m\u001b[0msome_digit\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;32m~\\anaconda3\\lib\\site-packages\\sklearn\\linear_model\\_stochastic_gradient.py\u001b[0m in \u001b[0;36mfit\u001b[1;34m(self, X, y, coef_init, intercept_init, sample_weight)\u001b[0m\n\u001b[0;32m    730\u001b[0m                          \u001b[0mloss\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mloss\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mlearning_rate\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mlearning_rate\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    731\u001b[0m                          \u001b[0mcoef_init\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mcoef_init\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mintercept_init\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mintercept_init\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 732\u001b[1;33m                          sample_weight=sample_weight)\n\u001b[0m\u001b[0;32m    733\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    734\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;32m~\\anaconda3\\lib\\site-packages\\sklearn\\linear_model\\_stochastic_gradient.py\u001b[0m in \u001b[0;36m_fit\u001b[1;34m(self, X, y, alpha, C, loss, learning_rate, coef_init, intercept_init, sample_weight)\u001b[0m\n\u001b[0;32m    568\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    569\u001b[0m         self._partial_fit(X, y, alpha, C, loss, learning_rate, self.max_iter,\n\u001b[1;32m--> 570\u001b[1;33m                           classes, sample_weight, coef_init, intercept_init)\n\u001b[0m\u001b[0;32m    571\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    572\u001b[0m         if (self.tol is not None and self.tol > -np.inf\n",
      "\u001b[1;32m~\\anaconda3\\lib\\site-packages\\sklearn\\linear_model\\_stochastic_gradient.py\u001b[0m in \u001b[0;36m_partial_fit\u001b[1;34m(self, X, y, alpha, C, loss, learning_rate, max_iter, classes, sample_weight, coef_init, intercept_init)\u001b[0m\n\u001b[0;32m    527\u001b[0m                              \u001b[0mlearning_rate\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mlearning_rate\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    528\u001b[0m                              \u001b[0msample_weight\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0msample_weight\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 529\u001b[1;33m                              max_iter=max_iter)\n\u001b[0m\u001b[0;32m    530\u001b[0m         \u001b[1;32melse\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    531\u001b[0m             raise ValueError(\n",
      "\u001b[1;32m~\\anaconda3\\lib\\site-packages\\sklearn\\linear_model\\_stochastic_gradient.py\u001b[0m in \u001b[0;36m_fit_binary\u001b[1;34m(self, X, y, alpha, C, sample_weight, learning_rate, max_iter)\u001b[0m\n\u001b[0;32m    586\u001b[0m                                               \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_expanded_class_weight\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;36m0\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    587\u001b[0m                                               \u001b[0msample_weight\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 588\u001b[1;33m                                               random_state=self.random_state)\n\u001b[0m\u001b[0;32m    589\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    590\u001b[0m         \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mt_\u001b[0m \u001b[1;33m+=\u001b[0m \u001b[0mn_iter_\u001b[0m \u001b[1;33m*\u001b[0m \u001b[0mX\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mshape\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;36m0\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;32m~\\anaconda3\\lib\\site-packages\\sklearn\\linear_model\\_stochastic_gradient.py\u001b[0m in \u001b[0;36mfit_binary\u001b[1;34m(est, i, X, y, alpha, C, learning_rate, max_iter, pos_weight, neg_weight, sample_weight, validation_mask, random_state)\u001b[0m\n\u001b[0;32m    440\u001b[0m         \u001b[0mmax_iter\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mtol\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mest\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mfit_intercept\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mest\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mverbose\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    441\u001b[0m         \u001b[0mint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mest\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mshuffle\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mseed\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mpos_weight\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mneg_weight\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mlearning_rate_type\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 442\u001b[1;33m         est.eta0, est.power_t, est.t_, intercept_decay, est.average)\n\u001b[0m\u001b[0;32m    443\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    444\u001b[0m     \u001b[1;32mif\u001b[0m \u001b[0mest\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0maverage\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;31mKeyboardInterrupt\u001b[0m: "
     ]
    }
   ],
   "source": [
    "from sklearn.linear_model import SGDClassifier\n",
    "\n",
    "sgd_clf = SGDClassifier(random_state = 42)\n",
    "sgd_clf.fit(X_train, y_train_7)\n",
    "\n",
    "sgd_clf.predict([some_digit])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 性能考核\n",
    "## 使用交叉验证测量精度"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "    评估分类器较评估回归器困难\n",
    "    "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {
    "collapsed": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0.9629 , 0.97995, 0.9772 ])"
      ]
     },
     "execution_count": 31,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.model_selection import cross_val_score\n",
    "cross_val_score(sgd_clf,X_train, y_train_7, cv = 3, scoring=\"accuracy\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# 把每张图都分类成 非7\n",
    "from sklearn.base import BaseEstimator\n",
    "class Never7Classifier(BaseEstimator):\n",
    "    def fit(self, X, y = None):\n",
    "        pass\n",
    "    def predict(self,X):\n",
    "        return np.zeros((len(X),1), dtype =bool)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "metadata": {
    "collapsed": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0.8933 , 0.89775, 0.8957 ])"
      ]
     },
     "execution_count": 39,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "never_7_clf = Never7Classifier()\n",
    "cross_val_score(never_7_clf, X_train, y_train_7, cv=3, scoring=\"accuracy\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "* 准确率超过90% ，因为5的图像大约只有10%，你猜一张图不是5， 90%的时间你都是正确的\n",
    "* 这说明准确率无法成为分类器的首要性能指标，特别是当你处理偏科数据集， 某些类比其他类更为频繁"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 混淆矩阵\n",
    "    评估分类器性能的更好方法是混淆矩阵\n",
    "    A类别实例被分为B类别次数\n",
    "    想要知道分类器将数字3和数字5混淆多少次，通过混淆矩阵的5行3列"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "from sklearn.model_selection import cross_val_predict\n",
    "\n",
    "y_train_pred = cross_val_predict(sgd_clf, X_train, y_train_7,cv =3)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 与cross_val_score相比\n",
    "    执行交叉验证\n",
    "    返回的不是评估分数，而是每个折叠的预测\n",
    "    每一个实例在模型预测时使用的数据，data没有参与训练"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 47,
   "metadata": {
    "collapsed": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[53379,   356],\n",
       "       [ 1243,  5022]], dtype=int64)"
      ]
     },
     "execution_count": 47,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.metrics import confusion_matrix\n",
    "\n",
    "confusion_matrix(y_train_7,y_train_pred)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "    [真负类，假正类\n",
    "    假负类，真正类]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 48,
   "metadata": {
    "collapsed": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([False, False, False, ...,  True, False, False])"
      ]
     },
     "execution_count": 48,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y_train_pred"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "\n",
    "\n",
    "## 正类预测的准确率 被称为分类器的精度\n",
    "## 精度和召回率\n",
    "\n",
    "\n",
    "$\n",
    "\\text{精度} = \\cfrac{TP}{TP + FP}\n",
    "$\n",
    "\n",
    "TP是真正类的数量，FP是假正类的数量\n",
    "\n",
    "\n",
    "\n",
    "$\n",
    "\\text{召回率TPR} = \\cfrac{TP}{TP + FN}\n",
    "$\n",
    "* 检测正类实例的比例\n",
    "FN是假负类的数量\n",
    "![jupyter](./zhaohui.jpg)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 50,
   "metadata": {
    "collapsed": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.9338043882484195"
      ]
     },
     "execution_count": 50,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.metrics import precision_score , recall_score\n",
    "\n",
    "precision_score(y_train_7, y_train_pred)  # 预测为7的样本中预测正确占比 （精度）"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 53,
   "metadata": {
    "collapsed": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.8015961691939345"
      ]
     },
     "execution_count": 53,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "recall_score(y_train_7, y_train_pred)  # 所有样本7中被预测为7的样本（召回率）"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# 说明 检测一张图的时候，只有90%的概率是准确的，而且只有64%的数字5 被它检测出来\n",
    "# 精度和召回率合成单一指标，成为 F1 分数，谐波平均值\n",
    "# 平均值平等对待所有的值，谐波平均值会给予较低值更高的权重，只有召回率和精度都很高时，才能获得较高的F1分数"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "$\n",
    "F_1 = \\cfrac{2}{\\cfrac{1}{\\text{precision}} + \\cfrac{1}{\\text{recall}}} = 2 \\times \\cfrac{\\text{precision}\\, \\times \\, \\text{recall}}{\\text{precision}\\, + \\, \\text{recall}} = \\cfrac{TP}{TP + \\cfrac{FN + FP}{2}}\n",
    "$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 54,
   "metadata": {
    "collapsed": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.862664261788199"
      ]
     },
     "execution_count": 54,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.metrics import f1_score\n",
    "f1_score(y_train_7,y_train_pred)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "    F1分数对那些具有相近精度和召回率 分类器更有利，这不一定符合你的期望\n",
    "    有时候你更关心精度，有时你能关心召回率\n",
    "    训练一个分类器检测儿童可以放心观看的视频，你可能要求拦截了很多好的视频，低召回率，保留下来的都是安全的视频，高精度\n",
    "    不能同时增加精度并减少召回率，反之亦然"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "    SGDClassifier对每一个样本基于训练出的模型函数计算出一个分数，data于阈值为正类，\n",
    "    否则为负类\n",
    "    阈值提高，精度提高，zip回降低\n",
    "    反之阈值降低，精度降低，zip回提高\n",
    "    scipyklearn不可直接设置阈值，但可访问决策分数\n",
    "    SGDClassifier默认阈值为0\n",
    "        "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 56,
   "metadata": {
    "collapsed": true
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\wjp\\anaconda3\\lib\\site-packages\\sklearn\\linear_model\\_logistic.py:765: ConvergenceWarning: lbfgs failed to converge (status=1):\n",
      "STOP: TOTAL NO. of ITERATIONS REACHED LIMIT.\n",
      "\n",
      "Increase the number of iterations (max_iter) or scale the data as shown in:\n",
      "    https://scikit-learn.org/stable/modules/preprocessing.html\n",
      "Please also refer to the documentation for alternative solver options:\n",
      "    https://scikit-learn.org/stable/modules/linear_model.html#logistic-regression\n",
      "  extra_warning_msg=_LOGISTIC_SOLVER_CONVERGENCE_MSG)\n"
     ]
    }
   ],
   "source": [
    "# 如何设置阀值\n",
    "# 用predict_proba得到每个实例属于正类的概率，然后对概率切一下。以LogisticRegression为例\n",
    "from sklearn.linear_model import LogisticRegression\n",
    "clf = LogisticRegression()\n",
    "clf.fit(X_train, y_train)\n",
    "pred_proba = clf.predict_proba(X_test)[:, 1]\n",
    "threshold = 0.75  # 阀值设置为0.75\n",
    "pred_label = pred_proba > threshold\n",
    "\n",
    "# pred_proba是每个实例为真的概率\n",
    "# 假设阈值是0.75\n",
    "# pred_label里True就是概率大于0.75的"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 57,
   "metadata": {
    "collapsed": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([False, False, False, ..., False, False, False])"
      ]
     },
     "execution_count": 57,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pred_label"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 59,
   "metadata": {
    "collapsed": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([-15815.26941994])"
      ]
     },
     "execution_count": 59,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 返回决策值decision_function\n",
    "y_scores = sgd_clf.decision_function([some_digit])\n",
    "y_scores"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 61,
   "metadata": {
    "collapsed": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([False])"
      ]
     },
     "execution_count": 61,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "threshold = 0\n",
    "y_some_digit_pred = (y_scores>threshold)\n",
    "y_some_digit_pred"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 62,
   "metadata": {
    "collapsed": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ True])"
      ]
     },
     "execution_count": 62,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 提高阀值可以降低召回率，提高阀值到200000，就错了这个图\n",
    "threshold = -200000\n",
    "y_some_digit_pred = (y_scores > threshold)\n",
    "y_some_digit_pred"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 64,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "y_scores = cross_val_predict(sgd_clf, X_train, y_train_7, cv=3,\n",
    "                             method=\"decision_function\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 65,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "from sklearn.metrics import precision_recall_curve\n",
    "\n",
    "precisions , recalls, thresholds = precision_recall_curve(y_train_7, y_scores)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 69,
   "metadata": {
    "collapsed": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([-28346.8383089 ,  -7211.44415289, -65618.74870048, ...,\n",
       "        13494.02429626, -34349.60058391, -20217.606391  ])"
      ]
     },
     "execution_count": 69,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y_scores"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "    使用matplotlib 绘制精度和召回相对于阀值的函数图"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 68,
   "metadata": {
    "collapsed": true
   },
   "outputs": [
    {
     "data": {
      "image/png": "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HDhwIMP2YmNjKVu2rAePTOW1qVPta7qK77nSu15viv1UjB3Hd7D4r8W0rtLaY7Eppa5cTk6L9gEV001X4NLL0AOByQDGmGVAIaCUJwIsiKZNm8aqVauYNWsWHTp0YPTo0UyYMOHi8tjYWCZMmEBwcHCGIbXG9dGjRzl+/DgpKSlUqFAhy/2kpKTQo0cPfvrpJ1544QUWLFjAqlWreP755wEcf5xK5U5Kim1pq2pVaH2FOTQoIIhhzYcB8Paytz0YnVLqauTkzHgVUFNEqgL7sRW0/p6pzB6gPTBOROpik3GcJwMtSBo0aECNGjUAe1n5uuuu46mnnqJ3796Eh4dTsmRJbrrpJoYPH+52/fLly5OcnExAQAD79+/Pcj87duwgJiaGiRMncle6G4w//vijZw9I5YuAAHj5Zds709XcXfjn9f/krd/eYubWmew4toPqkdU9F6RS6opk+5M2xiQBQ4G5wCZsrekNIjJSRHq4ij0BPCAia4GvgQHG5KQ5AhUaGspbb71FbGwso12t/nfp0oV169ZRv359oqOjLxlCQ0MJCwujVatWfPnll5w7d87ttuPj4wEITtdWYmJiIpMmTcr7A1N55mpv80eFR/G3+n/DYPjv7//NfgWlVJ7LyZkxxphZwKxM815MN74RuNGzofmPHj160KxZM95++22GDh3KyJEjad68OTfffDNDhw6lSpUqHD9+nPXr17Nz504+//xzAN5++21at25Ny5YteeKJJ6hQoQI7d+5kzZo1fPjhh9StW5fKlSvz/PPPExgYSHBwMO+m9kSvfMrmzfaRpl69wBN1H4c2G8qX677k45iPef6m54kIjbj6jSqlrphWpfUSr7zyCrGxsYwZM4ZKlSoRExNDw4YNee655+jYsSMPPfQQixYtylBbulmzZixdupSKFSsybNgwunXrxltvvXXxPnJISAjTp0+nbNmy3HPPPTz88MPcfPPNPPPMJe22KC83aRI8+iike4T8qlxf4XpuqnQTpy6c4vM/PvfMRpVSV0ycupocHR1tYmJisly+adMm6tatm48RKW+k3wOrfn3YuNGeHXfq5Jltfr/pe3pP7k2dUnXYOGSjPuakVB4TkdXGGLddu+iZsVJebssWm4iLF4c2bTy33e41u1MmvAybj2xm6d6lntuwUirXNBkr5eVedNXOuOUWCAnx3HZDg0K589o7AZi6carnNqyUyjVNxkp5MWNg8mQ7ntvmL3Oib4O+AExcN5ELSRc8vwOlVI5oMlbKi61alTbewW0js1enWflm1I+qz9FzR/l1z6+e34FSKke8Ohnro8r+TT9/+0xxr14wfDi4mi73KBHh1lq3AvDT1p88vwOlVI54bTIODg7OsjEL5R/OnTuXocESfxQdDd9/D3nZwVb3Wt0BmLFlBilG+9RWyglem4xLly7N/v37iY+P1zMkP2OMIT4+nv3791O6dGmnwynwWlZoScWiFdl1Yhezt812Ohyl/FKOWuByQtGitnvkAwcOkJiY6HA0Kr8FBwdTpkyZi98DfzRjhu0comNHCA/Pu/0EBgQyrPkwnv75aT5c+eHFM2WlVP7x2kY/lPJ3qW1wzJwJ3brl7b6OnTvGNf+5hvNJ5zn85GFKh+sVCaU8TRv9UMrH7NqVNp6uBdQ8E1k4kpYVWgLw297f8n6HSqkMNBkr5YVSu7cuUwYKFcqffTYr3wyAVftXZVNSKeVpmoyV8jLGwJQpdvyll/Jvv+2q2lPw6Vum599OlVKAJmOlvE5MDKxfD2XLwsCB+bffdlXbUbxQcTbGbWTtobX5t2OllCZjpbzNzJn2tVcvz7ZFnZ3gwGD61rfNY37151f5t2OllCZjpbxN3bpw003Qo0f+7/uO+ncA9lK1Pt+vVP7RZKyUl+nbFxYvhi5d8n/fN1e+mVJhpdh6dCtrD+ulaqXyiyZjpdRFQQFB9KnbB4DvN33vcDRK+Q9Nxkp5kVGjYOVKW6PaKT3r9ARsW9VKqfyhyVgpL7F/PwwbBq1bw9mzzsXRtkpbioQUYe3htew+sdu5QJTyI5qMlfIS06bZ1y5doEgR5+IIDQqlSw17w/rLdV86F4hSfkSTsVJeIrWhjz59nI0DYEDDAQBM36wNgCiVHzQZK+UFDh+2NaiDg+GWW5yOBtpWbUtIYAi/H/ydo/FHnQ5HqQJPk7FSXmDaNFtpq1MnKFbM6WggLDiMGyveiMGwYNcCp8NRqsDTZKyUF5g61b56wyXqVG2qtAFg4e6FzgailB/QZKyUw4yB2rWhfHlnWt3Kyi217PXyKRunkJyS7HA0ShVsmoyVcpiIfb543z6IjHQ6mjSNyzameonqxMXHsWzfMqfDUapA02SslJcQcTqCjESEnrVtAyBaq1qpvKXJWCkHJSfb54qXLnU6EvdSW+P6YcsP2nGEUnlIk7FSDoqJgblzoVUrpyNx78aKNxJZOJLtx7bzZ+yfToejVIGlyVgpB82ebV+HDHE2jqwEBgTSo7atVTZr2yyHo1Gq4NJkrJSDZs60r127OhvH5XSv2R2AaZunORyJUgWXJmOlHLJ7t71MHRYG7do5HU3WutboSqGgQqzcv5J9p/Y5HY5SBVKOkrGIdBGRLSKyXUSeyaLMHSKyUUQ2iMhXng1TqYJn3Dj7euutNiF7q/CQcDpU6wDAwl3aAIhSeSHbZCwigcBHQFegHtBfROplKlMTeBa40RhTH3g0D2JVqsBISoJPP7XjDzzgbCw50aZyGwDm7pjrbCBKFVA5OTNuDmw3xuw0xiQA3wA9M5V5APjIGHMcwBgT69kwlSpYDh2CunWhXj3vvkSdKv0jTtoal1Kel5NkfA2wN930Pte89GoBtURkqYgsF5Eu7jYkIoNEJEZEYuLi4q4sYqUKgAoVYP58WLPG+xr7cKdGZA0qFavEmYQzrI9d73Q4ShU4OUnG7v5UZH76PwioCbQB+gOfikjxS1YyZqwxJtoYEx0VFZXbWJUqcIKDnY4g59pWaQvopWql8kJOkvE+oGK66QrAATdlfjDGJBpjdgFbsMlZKZXJ6tUwbx4kJDgdSe6kdhzx49YfHY5EqYInJ8l4FVBTRKqKSAjQD5iRqcx0oC2AiJTCXrbe6clAlSooWreGzp3h1VedjiR3OlTrgCCs3L+S+MR4p8NRqkDJNhkbY5KAocBcYBMw2RizQURGikhqh29zgaMishFYCDxljDmaV0Er5atOnYKzZ+343Xc7G0tuFS9UnEZlG5GQnMCyvdqLk1KelKPnjI0xs4wxtYwx1Y0x/3bNe9EYM8M1bowxjxtj6hljrjXGfJOXQSvlq6a5GrFq3RqqV3c2livRsVpHwNaqVkp5jrbApVQ+mjTJvv79787GcaV61+sNwNRNU/URJ6U8SJOxUvnk0CH43/9sDeo+fZyO5so0K9+M6iWqc+D0AT07VsqDNBkrlU8mT4aUFNspRGSk09FcGRHhvsb3ATBn+xyHo1Gq4NBkrFQ+KVIErrvOdy9Rp2pftT0AS/YscTgSpQqOIKcDUMpf3HefHUzmJnN8TKOyjQgLDmPTkU0cOH2A8hHlnQ5JKZ+nZ8ZK5TNfaP7yckKDQtNa49qurXEp5QmajJXKB198AVu2OB2F53St0RWAbzboU4xKeYImY6Xy2IEDMHCgvV985ozT0XjGHfXvoEhIEebtmMeG2A1Oh6OUz9NkrFQe++ore5+4e3dbiasgiAqPol/9foB95lgpdXU0GSuVh4yxl6gB7r3X2Vg87dbatwLw09afHI5EKd+nyVipPLRqFWzcCFFR0K2b09F4Vvuq7SkcVJhVB1Zx6Mwhp8NRyqdpMlYqD6WeFd91l2/1XZwT4SHhtKvaDoDvN33vcDRK+TZNxkrlkaQkmOq6nVrQLlGnur3u7QDM3DbT4UiU8m2ajJXKI6dP26YvGza0NbVJo78AAB/9SURBVKkLom417bX3BbsWaB/HSl0FTcZK5ZESJWD8eFi92vcb+shK2SJlaVquKeeTzrNw10Knw1HKZ2kyViqPBQY6HUHe6l6zOwCzts1yOBKlfJcmY6XywKRJ9n5xYqLTkeS97rVsMp66aSpJKUkOR6OUb9JkrJSHJSXB8OG2z+IlftCxUbPyzahSvAqHzx7WS9VKXSFNxkp52KxZsH8/1KwJbdo4HU3eExHuue4eAL5Zr21VK3UlNBkr5WFjx9rXQYMKbsWtzFIfcZq+ZTqnL5x2OBqlfI8mY6U8aM8emD0bQkIK7rPF7lxX5jqalW/GsXPH+OyPz5wORymfo8lYKQ/69FNISYHbb7dNYPoLEeHpG58G4Ov1XzscjVK+R5OxUh6SkAD//a8dHzTI2Vic0K1mN8KDw1m5fyW7ju9yOhylfIomY6U8JCkJnn4aevXyj4pbmYUFh9Gjdg8Axq8d73A0SvkWTcZKeUhYGDz2GHz/vf9U3Mrs3ob2Rvn4teNJMSkOR6OU79BkrJTymA7VOlChaAV2n9jNgl0LnA5HKZ+hyVgpD/jnP+GZZyA21ulInBUYEMjd190NwMyt2pOTUjmlyVipq3TwIHz4IbzxBpw753Q0zutcvTMA83fOdzgSpXyHJmOlrtKrr9rXiAioXNnZWLxBy4otKRJShA1xG1i5f6XT4SjlEzQZK3UVzp+HKVPs+Gfa1gUAIYEhDG46GICPYz52OBqlfIMmY6WuwtixcOgQNG5sO4ZQ1sAmAwH4ccuPWqtaqRzQZKzUFTp3Dl57zY6PGOG/jzO5U7tkbaoUr8LRc0eJORDjdDhKeT1NxkpdoZkz7Vlx06Zw661OR+NdRIRuNboB9uxYKXV5moyVukJ9+sBvv9ma1HpWfKnb6twGwNRNUx2ORCnvF+R0AEr5spYtnY7Ae7Wp0obIwpFsOrKJDbEbqF+6vtMhKeW1cnRmLCJdRGSLiGwXkWcuU66PiBgRifZciEp5lzNnYNUqp6PwfsGBwfSq0wuA7zZ+53A0Snm3bJOxiAQCHwFdgXpAfxGp56ZcBPBPYIWng1TKm4waBc2bw7PPOh2J9/tbvb8BmoyVyk5OzoybA9uNMTuNMQnAN0BPN+VeBt4EznswPqW8ytGjaUm4XTtnY/EF7aq2I7JwJBvjNrIhdoPT4SjltXKSjK8B9qab3uead5GINAYqGmN+utyGRGSQiMSISExcXFyug1XKabffbl8rVIAOHZyNxRcEBwZzW21bkUvPjpXKWk6Ssbt6oubiQpEA4F3giew2ZIwZa4yJNsZER0VF5TxKpbzA/v2weLEd/+QTrUGdU3+rr5eqlcpOTpLxPqBiuukKwIF00xFAA+AXEdkNtABmaCUuVdAMH25fK1aEbt2cjcWXtK/a/uKlam2rWin3cpKMVwE1RaSqiIQA/YAZqQuNMSeNMaWMMVWMMVWA5UAPY4w2u6MKjI8/hkmT7PgC7aY3V4IDgy92qzht0zSHo1HKO2WbjI0xScBQYC6wCZhsjNkgIiNFpEdeB6iUN2jRAq6/HkaOhBo1nI7G99xS6xYApm3WZKyUO2KMyb5UHoiOjjYxMXryrHzDqVP22eJ27fRe8ZVITE6kzNtlOH7+OBuGbKBe1CVPRypV4InIamOM21u42hymUpdx6BCcPAlFi0L79pqIr1RwYPDF5jG/26AVuZTKTJOxUlkwBu67D+rWhaVLnY7G991R/w5Aa1Ur5Y4mY6Wy8OqrMHs2HDwI1ao5HY3va1+1PSUKlWBD3AY2xm10OhylvIomY6XcOHECXnjBjo8aBeXKORtPQaCXqpXKmiZjpdx49NG08Yceci6OgkYvVSvlniZjpTL56isYPx4KFYJNmyBAfyUe075qe4qFFmND3AZ2Ht/pdDhKeQ39M6NUOqdOwcMP2/EPPoA6dZyNp6AJDgymc43OAEzdONXhaJTyHpqMlUqnaFH46Sd47DG4/36noymY7rz2TgDeXf4u55O0kzelQJOxUpe48Ub4z3/0meK8ckutW6gfVZ+DZw4yY8uM7FdQyg9oMlYKmDEDZs50Ogr/ECABPBRta8V9+vunDkejlHfQZKz83qZNcM89cMstsGSJ09H4h34N+iEIi/5axKEzh5wORynHaTJWfu3ECejY0TZ52bu3vUSt8l7JsJL0qN2DhOQEHp/7uNPhKOU4TcbKbyUlQZs2sH8/1KxpH2fS+8T55/UOrxMUEMQ367/Rx5yU39NkrPySMTBkCKxda6dnz4bwcGdj8jd1StWhT70+GIy2yKX8niZj5Zfeegv++1/bsMdvv0H16k5H5J9SH3N6f8X7+piT8muajJVf6toVKla0rW21bOl0NP6re83uNCjdgINnDjJ983Snw1HKMZqMlV+69lrYvBl69XI6Ev8mIjzczDZ59sbSNzDGOByRUs7QZKz8xvjx8O67adNhYc7FotIMaDSAMuFlWHNoDfN2zHM6HKUcoclYFXjGwL/+BQMGwOOPw5o1Tkek0isUVIjHWjwGwGtLXnM4GqWcoclYFWjGwPDhMGKE7X3pww+hUSOno1KZDY4eTERIBIv+WsSaQ/rfkvI/moxVgXX+PLRvb2tOBwbCt9/C0KFOR6XcKVaoGP9o9A8APlr5kcPRKJX/NBmrAmn/frjpJli40E5Pnw59+jgbk7q8B5o+gCBMWDeBY+eOOR2OUvlKk7EqkEQgNhbKloVff7XtTivv1qB0AzpU60BCcoL2daz8jiZjVWCkpNgmLgHKl4f582H9emjVytm4VM6lNgLy9rK3SUhOcDgapfKPJmNVIBw6BN262cpaqWrVgpIlnYtJ5V7/a/tTq2Qtth7dyqR1k5wOR6l8o8lY+bz586FhQ5g71z5LHBfndETqSoUEhvD0DU8DMGHdBIejUSr/aDJWPuv0aRg8GDp1sveH27a1HT9ERTkdmboafer1oXBQYX7Z/QsbYjc4HY5S+UKTsfJJ334LDRrAJ59AcDC8+irMmwfXXON0ZOpqFStUjAGNBgDaCIjyH5qMlU+aPRv27IEmTWD1anj2WQgKcjoq5SnDbxxOgAQwecNk4s7qfQdV8GkyVj7h7FnYti1t+vXXbReIK1faTh9UwVK5eGW61exGYkoiY1ePdTocpfKcJmPl1VJS4OuvoW5d28NSYqKdX7Ys3H+/bVlLFUz/bP5PAEbHjCYxOdHhaJTKW5qMlddasgSio+Hvf4e9eyE0FA4fdjoqlV86VOtAvah6HDh9gKmbtBEQVbBpMlZeZ8kSaNfONmf5xx9QoULaJekKFZyOTuUXEbl4dvzvX/9NiklxOCKl8o4mY+VVEhKgb1/bpnTRovDii7Bli16S9lcDGg2gUrFKrI9dzw+bf3A6HKXyTI6SsYh0EZEtIrJdRJ5xs/xxEdkoIutE5H8iUtnzoaqC6MwZ+3jSwYN2OiQEXn4ZXnoJ/vrL9kMcFuZsjMo5oUGhPNnySUAfc1IFW7bJWEQCgY+ArkA9oL+I1MtU7A8g2hhzHTAFeNPTgaqCZfNm+Oc/7XPBgwfby9Cp7rvP9j9cvLhj4SkvMrDJQIoXKs6qA6uYv2O+0+EolSdycmbcHNhujNlpjEkAvgF6pi9gjFlojIl3TS4H9M6eukRSEkybBh062NrRH34Ip07BDTdAo0ZOR6e8VVhwGI9e/ygAA2cM1A4kVIGUk2R8DbA33fQ+17ysDARmu1sgIoNEJEZEYuK0AWG/88ADcPvt8L//2UvPDzxgK2gtXQo9ejgdnfJmL9z8ArVL1mbvqb18uOJDp8NRyuNykozFzTzjtqDIXUA08Ja75caYscaYaGNMdJQ2IFxgJSTYThsGD4aZM9Pm9+tne1J67z3Yvx/GjtUzYpUzgQGBvN3pbQCeW/AcP+/82eGIlPKsnDQguA+omG66AnAgcyER6QA8D7Q2xlzwTHjKV5w+DXPm2MvQM2fay89gX7t3t+OdOsGmTRCgdfjVFbil1i0Maz6MD1d+SL8p/fjzoT8pF1HO6bCU8oicJONVQE0RqQrsB/oBf09fQEQaA58AXYwxsR6PUnm1J5+EUaPgQrp/wa69Fm67DXr3TpsnYgelrtR7Xd7jz9g/+WX3L/Sd0pdFAxYh+qVSBUC25yjGmCRgKDAX2ARMNsZsEJGRIpJ6p+8toAjwnYisEZEZeRaxckxSEqxYAa+9lrGd6BIl7KXpG2+Et9+2y9atg5EjbT/DSnlKgAQwuc9kosKi+HXPr4xbM87pkJTyCDHG7e3fPBcdHW1iYmIc2bfKmZQU2LABFiywla4WLUq7/PzKK/D883b8yBGbqMuWdS5W5V8mrp3IPdPvoULRCmx+eDPhIeFOh6RUtkRktTEm2t0yvXunLjpzJuP0tdfCddfBo4/Cjz/aRFyjBjz4ILRsmVauVClNxCp//f3av9OkXBP2ndrHyEUjnQ5HqaumPcD6qeRke9b722/20vOKFbbZySNH7GVngPr1bQJu0wbat7ftRVeq5GjYSgG2dvXobqNp+VlL3ln2DrfWvpVWlVo5HZZSV0wvU/uZ7dth6FBYvhxOnsy4LDgYFi+GFi3sdHw8FC6sla6U93p6/tO89dtblI8oz9rBaykVVsrpkJTK0uUuU+uZcQFz5Ahs3GiHtWthzRqoUwe++MIuj4iwzwADVK5sW79q0QKuv94+8xsamrYtbRNaebtX27/KL7t/YdWBVdz3w3380O8HrV2tfJImYx+UkmI7UShTJi1hvvyyfbwo1s2DZSdOpI2XKQPTp0PTptodofJ9QQFBfNX7K5r9txk/bv2RN5e+yfBWw50OS6lc02TsxRISYNky2LnTPi60dasdtm2D8+fh55/tvVywtZljY6FIEdvuc716tvJVo0b2Nb2ePS/dl1K+qkZkDSbcNoEe3/TguQXPUbFYRf5+7d+zX1EpL6LJ2CHG2OS5a1fGISoKXn3VlomPt5Wn3ClbNuM938GDYeBAe7arLVwpf3Nr7Vv5d7t/8/yC57nr+7s4m3CWB5o+4HRYSuWYJuM8kHqWun8/HDhgX3v1gnKulvuGD4cPPrBnt5nVrp2WjIsXh44doXRpqFnTtutcq5YdL1o043rltFVA5eeeu+k5jp87ztvL3mbQT4NINskMjh7sdFhK5Ygm4xwyxj6He+SIHWJjITw87cx1/3649VY4eNAuS0nJuH61amkJMzzcJuISJaBq1YxDzZoZ15s3L88PTakC482ObxJZOJLnFjzHk/OepFP1TlQrUc3psJTKlt8+2nThQlpiTT/ExcEjj6Q9a/voozBlil12IVP3Fx06wHxXX+enTkGxYmnLoqKgfHm45ho7DB4MTZqklQ0IsPd3lVKeZYyh21fdmLN9DteWvpbfBv5GkRD9sSnnFchHmy5csD0FlUr3WOHChfay8KlTdjh50tYkPnHCnsEOGmTL/for3Hxz1tvu3TstGZ8+bc96wdZcLlXKDlFR0KxZ2joREbbhjHLlbI3lkJCst5/5ErNSynNEhK97f02LT1vwZ+yf9Jnch+n9plMoqJDToSmVJcfOjGvXjjbvvBPD2bO2otLZs/Yy8Jkztsu91OYWZ8+GN96wiTU1yZ46ZWsag70/Gxhox5s1g6xOtu+9F8aNs+MbNtgODFKTavoEW6qUTdqpj/0cOGBbqypZUp+7VcqXbIrbRKsvWnHs3DFurnwzP/X/iYjQCKfDUn7MK8+Mt22z91jdKVkyLRkfO2Y7KMgsKMheFo6Pt2elYPvLTa3cVLSonV+8uD3LrVMnbd169SAxMWctS5Uvn7vjUkp5h7pRdZl/93y6TurK4r8W03FiRxbcu4CwYP2vWnkfx86MixePNjfeGENYmK3QFBZmk2d4uE2qqU0yHjoEmzenJdjUITRUm2lUSmVvx7EdtB3flr2n9jIkeggfdf/I6ZCUn7rcmbHfVuBSSvmPlftXcsNnN2AwrHlwDdeWudbpkJQf0i4UlVJ+rfk1zXmw6YOkmBSGzR5GiknJfiWl8pEmY6WUXxjZdiQlCpVg0V+LeO5/zzkdjlIZaDJWSvmFkmElmdhrIgBvLH2DJ+c9SVJKksNRKWVpMlZK+Y3utbrz6a2fEhQQxDvL3uHWr2/lbMJZp8NSSpOxUsq/DGwykNl3zqZYaDHmbJ/DjZ/fyIbYDU6HpfycJmOllN/pUK0DKx9YSY3IGqw9vJYmY5vw6JxH9bK1cowmY6WUX6pVsharB63m7uvuJiE5gfdXvE/7Ce05ePqg06EpP6TJWCnlt4qGFmVCrwnMuXMO5YqUY/Ffi2k4piHfbfgOp9pgUP5Jk7FSyu91rtGZPx78g7ZV2hIXH8cdU+7grml3cfzccadDU35Ck7FSSgFlipRh/t3zGd1tNIWDCvPVn19R56M6fBLzCYnJiU6Hpwo4TcZKKeUSGBDIQ80eYtnAZbSq1IrYs7EMnjmYBh83YMGuBU6HpwowTcZKKZVJw7INWTRgEd/97TsqFavE1qNbaT+hPcNmDeN80nmnw1MFkCZjpZRyI0AC6FOvDxuHbOTlti8TKIGMWjWKlp+15M/DfzodnipgNBkrpdRlhIeE88LNL7D0vqVcE3ENaw6tocnYJny86mOtca08RpOxUkrlwPUVrmfDkA080OQBklKSGDJrCPVH12fGlhmalNVV02SslFI5VKxQMcbeOpavbv+KayKuYdORTfT8pifR/43m/eXvc/rCaadDVD5KnPqPLjo62sTExDiyb6WUuloJyQmMiRnDy4tf5kj8EQAKBRXillq30Ld+X9pXbU+JwiUcjlJ5ExFZbYyJdrtMk7FSSl25c4nn+HHrj3y06iMW/7X44vwACaBjtY50rt6ZexreQ8mwkg5GqbyBJmOllMoHe0/uZfKGyUzZNIXVB1aTmGIbCxGEGpE1uLbMtbSq2Iq2VdtyXZnrCBC9U+hPNBkrpVQ+Oxp/lB+2/MD4teNZsmcJKSYlw/LIwpE0K9+MskXKcnPlm6lavCpli5QlKjyKyMKRmqgLoKtOxiLSBXgfCAQ+Nca8nml5KDABaAocBfoaY3ZfbpuajJVS/uJ80nm2Ht3K7wd/55fdv7Bw90L2nNyTZfkACaBk4ZKUDi9NVHgUUWGuwTVeKqwUEaERRIREXPJaKKgQIpKPR6dy6qqSsYgEAluBjsA+YBXQ3xizMV2ZIcB1xpjBItIP6GWM6Xu57WoyVkr5K2MMf538i593/szek3vZdmwbe07uIS4+jtizsZw4f+KKtx0ogRQJKUJEqE3MIYEhGYbggOBL5l1ufkhgCMGBWa8jIghy8RW4ZF76VyDbZXVK1SEqPOrq32gvc7lkHJSD9ZsD240xO10b+wboCWxMV6YnMMI1PgUYJSJi9OE7pZS6hIhQpXgV7m9yv9vlicmJHIk/Qlx8HHFn4y4m6dTxo+eOcvrCaU4nnL74eibhDKcvnOZC8gVOXjjJyQsn8/moPOfr3l/Tr0E/p8PIVzlJxtcAe9NN7wOuz6qMMSZJRE4CJYEj6QuJyCBgkGvyjIhsuZKgPaQUmeLzM3r8/nv8/nzsoMfv9cfff0R/+tM/rzbv5PFXzmpBTpKxu5sPmc94c1IGY8xYYGwO9pnnRCQmq8sF/kCP33+P35+PHfT49fi98/hzUl1vH1Ax3XQF4EBWZUQkCCgGHPNEgEoppVRBl5NkvAqoKSJVRSQE6AfMyFRmBnCva7wPsEDvFyullFI5k+1latc94KHAXOyjTZ8bYzaIyEggxhgzA/gMmCgi27FnxL5w590rLpc7SI/ff/nzsYMevx6/F3Ks0Q+llFJKWdrEi1JKKeUwTcZKKaWUwwpUMhaRYSKyRUQ2iMib6eY/KyLbXcs6p5vfxTVvu4g8k25+VRFZISLbRORbV8U1RCTUNb3dtbxKfh5fTojIkyJiRKSUa1pE5ANXzOtEpEm6sve6jnGbiNybbn5TEfnTtc4H4moaR0QiRWS+q/x8EfGa/uFE5C0R2ew6xmkiUjzdMr/5/LOT1TH7GhGpKCILRWST6/f+iGu+2++oJ38H3kREAkXkDxH5yTWd6+9ubn8f3kJEiovIFNfvfpOItPTpz98YUyAGoC3wMxDqmi7teq0HrAVCgarADmxFtEDXeDUgxFWmnmudyUA/1/gY4CHX+BBgjGu8H/Ct08ed6T2oiK1o9xdQyjWvGzAb+yx4C2CFa34ksNP1WsI1XsK1bCXQ0rXObKCra/6bwDOu8WeAN5w+5nTH3gkIco2/kRqbP33+OXiPsjxmXxuAckAT13gEtsneell9Rz35O/CmAXgc+Ar4yTWdq+/ulfw+vGUAxgP3u8ZDgOK+/Pk7/oZ68IOZDHRwM/9Z4Nl003Ndb3BLYG7mcq43/ghpf9gvlktd1zUe5ConTh97umOYAjQEdpOWjD/BtiWeWmaL6w9Zf+CTdPM/cc0rB2xON/9iudR1XePlgC1OH3MW70MvYJK/ff45eF/cHrPTcXno2H7Atp/v9jvqyd+BtwzYNh/+B7QDfrqS725ufx9OH3O6eIoCuzL//nz58y9Il6lrATe5LsEsEpFmrvnumvO85jLzSwInjDFJmeZn2JZreWqzn44TkR7AfmPM2kyLcnv817jGM88HKGOMOQjgei3tsQPwrPuw/8mCn3z+OZTVMfs01yXXxsAKsv6OevJ34C3eA54GUvtmvJLvbm7fF29RDYgDvnBdpv9URMLx4c8/J81heg0R+Rko62bR89hjKYG9BNEMmCwi1ci6qU53/4iYy5Qnm2V5Lpvjfw57qfaS1dzMu9xxOnqMl3O54zfG/OAq8zyQBExKXc1NeZ/8/D3A1+O/hIgUAaYCjxpjTl3mtl6B+R0AiMgtQKwxZrWItEmd7aZodt/d3P4+vEUQ0AQYZoxZISLvYy9LZ8XrP3+fSsbGmA5ZLRORh4Dvjb2msFJEUrANgl+uOU93848AxUUkyPUfZPryqdvaJw40+5nV8YvItdj7PWtdf4wqAL+LSHOyPv59QJtM839xza/gpjzAYREpZ4w5KCLlgNirPKRcudznD7YiBnAL0N71PYAC9Pl7QE6atvUZIhKMTcSTjDHfu2Zn9R315O/AG9wI9BCRbkAh7GXb98j9dze3vw9vsQ/YZ4xZ4Zqegk3Gvvv5O33t34P3EAYDI13jtbCXHgSoT8YKCjuxlROCXONVSaugUN+1/ndkrAQxxDX+MBkrQUx2+rizeC92k3bPuDsZKy6sdM2PxN5zKeEadgGRrmWrXGVTKy50c81/i4yVI950+ljTHXMXbLeeUZnm+93nf5n3KMtj9rXB9d2cALyXab7b76gnfwfeNmCTSWoFrlx9d6/k9+EtA/ArUNs1PsL12fvs5+/4G+rBDyYE+BJYD/wOtEu37HlszcAtpKsRh61ht9W17Pl086tha9Jtd325U2toF3JNb3ctr+b0cWfxXuwmLRkL8JHrGP8EotOVu891LNuBf6SbH+16H3cAo0hrqa0ktsLINtdrpNPHmi7m7dh/wNa4hjH++vln8z65PWZfG4BW2MuG69J95t2y+o568nfgbQMZk3Guv7u5/X14ywA0AmJc34Hp2GTqs5+/NoeplFJKOawg1aZWSimlfJImY6WUUsphmoyVUkoph2kyVkoppRymyVgppZRymCZjpTxMbK9Z2Q27XWXHici+bDaZL0RkhCs2jzQGlLq9HJRr49pvG0/sVylf5FMtcCnlI1pmmp6GbTRhRLp5F/ItGqWU19NkrJSHGWOWp58WkQvAkczzr5aIhBpjNKkrVQDoZWqlvICINBaRX0Uk3tXJ+eBMywe4LuXeLCLficgJbC9Fqctbi8j/ROS0iJwVkbki0iDTNjqLyFIROSkiZ1wdx7/oJpyqIjLTVeYvEXlRRAIybau2iEwTkRMick5ElotIlxwcZ5SIfCUip1zrTsD2Q6uUX9NkrJTzimI7iP8S6IltE/djEWnrpuwkbPu5fXD1UiMi3bFN/50B7gL+DkQAv4pIRVeZasAMbFOpfYEewH+AcDf7mAYsAG7DNjP4L+De1IUiUh5Ygu07eyhwB3ACmCkiXbM51u+xnXk854ojCfgwm3WUKvD0MrVSzovANui/EEBEFmO7w+wPLMxUdoox5ulM894HFhljeqbOEJGF2Ib+nwAexXY3FwI8ZIw55Sq2IIt43jHGfOEa/1lE2rliSZ33OLYd4JbGmO2u/c3CdtTxb9L6ks5ARDpi25Tub4z5xjV7rojMJmMPOUr5HT0zVsp58amJGMB1H3gbUMlN2WnpJ0SkJlAdmCQiQakDEA8sA252FV0DJALfiEgfESlN1mZmml6fKZabgeWpidgVczLwNdBIRIpmsd2WQDK228P0vnFTVim/oslYKecddzPvAranncwOZppOTaqfYZNt+uEWbC82uBJnZ+xvfiJwSERWiEhrN/vI3Edz5lgi3cQBcAjbO04JN8sAygHHjTGJmeYfzqK8Un5DL1Mr5VsyP7d71PX6LPCzm/IJF1e0Z98LRSQU2zn9SOx93irGmCO5iOEYUNbN/LKu+DIn81QHgRIiEpwpIZfJxb6VKpA0GSvl27ZgK2XVN8a8npMVXJfBF4hIEeAHbAfyuUnGi4BHXUl8N4CIBGIrZP1hjDmdxXrLsB3X9ybjpel+udi3UgWSJmOlfJgxxojIw8APIhICTMYm1jLADcAeY8x/XI9K3QzMAvYCpbBn0wew94Rz411gADBfRF4CTgFDgFpA98vEOl9ElgCfiEgp7H3xvkCDrNZRyl/oPWOlfJwxZhY20YYDnwJzgTexl42XuYqtdS1/DZgHjMI+ItXOGHMul/s7gK0VvQH4GJiCvY/c3RgzJ5vVb8f+Q/Aa8C32hGBobvavVEEkxmTbdKxSSiml8pCeGSullFIO02SslFJKOUyTsVJKKeUwTcZKKaWUwzQZK6WUUg7TZKyUUko5TJOxUkop5TBNxkoppZTD/h+EzaFxenFsQQAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<Figure size 576x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "def plot_precision_recall_vs_threshold(precisionse, recalls, thresholds):\n",
    "    plt.plot(thresholds, precisions[:-1], \"b--\", label=\"Precision\", linewidth=2)\n",
    "    plt.plot(thresholds, recalls[:-1],\"g-\", label = \"Recall\",linewidth=2)\n",
    "    plt.xlabel(\"Threshold\", fontsize = 16)\n",
    "    plt.legend(loc=\"upper left\", fontsize=16)\n",
    "    plt.ylim([0,1])\n",
    "    \n",
    "plt.figure(figsize=(8,4))\n",
    "plot_precision_recall_vs_threshold(precisions, recalls, thresholds)\n",
    "plt.xlim([-70000, 70000])\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 70,
   "metadata": {
    "collapsed": true
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 576x432 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.rcParams['font.sans-serif'] = ['SimHei']  # 实现中文显示\n",
    "def plot_precision_vs_recall(precisionse,recalls):\n",
    "    plt.plot(recalls, precisions, \"b-\",linewidth = 2)\n",
    "    plt.xlabel(\"召回\", fontsize = 16)\n",
    "    plt.ylabel(\"精度\", fontsize = 16)\n",
    "    plt.axis([0,1,0,1])\n",
    "    \n",
    "plt.figure(figsize=(8,6))\n",
    "plot_precision_vs_recall(precisions, recalls)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 通过选择阀值来实现最佳的精度/召回率权衡"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 71,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# 目标设定为90%的精度，阀值大概在30000左右 , 设置了阀值为30000\n",
    "y_train_pred_90 = (y_scores > 20000)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 72,
   "metadata": {
    "collapsed": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.9951845906902087"
      ]
     },
     "execution_count": 72,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "precision_score(y_train_7, y_train_pred_90)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 74,
   "metadata": {
    "collapsed": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.09896249002394254"
      ]
     },
     "execution_count": 74,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "recall_score(y_train_7, y_train_pred_90)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## roc曲线\n",
    "    本质是 真正类率tpr和假正类率fpr（错误的分为正类的负类实例比例）\n",
    "    类似召回、精度曲线"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 75,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "from sklearn.metrics import roc_curve\n",
    "\n",
    "fpr, tpr, thresholds = roc_curve(y_train_7, y_scores)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 77,
   "metadata": {
    "collapsed": true
   },
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAf0AAAF6CAYAAAATeYHoAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjMsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+AADFEAAAgAElEQVR4nOzdd3xUVf7/8dfJpEBC6B1RQVF6MMQgRUE66rq6KkWKoCiubS1rB0TEtvhlXUVRlCqriPuzrQUxoFiQEtDYULGACNIxIT2ZOb8/ZoKRDWQCydzMnffz8eCRyczNnU/GOO855Z5jrLWIiIiI+0U5XYCIiIiEhkJfREQkQij0RUREIoRCX0REJEIo9EVERCKEQl9ERCRCKPRFREQiRMhD3xjTxBjz4REejzHG/NcY87Ex5vJQ1iYiIuJmIQ19Y0w9YAGQcITDrgfWW2t7AhcbYxJDUpyIiIjLhbql7wWGAVlHOKYPsCRw+wMgpYprEhERiQjRoXwya20WgDHmSIclANsCt/cBTQ49wBhzFXAVQEJCQte2bdtWbqHiGGvBZy02cNti8XpLvvd/LSz2YUzJ45Bf5MUTZQ4eby3kFnqJ9RhyC71ERRlMqfPbg7f9t4p9Woq6skVHmYP/nxvAGCjyWqKjDNGe//3/P5h7KuLIbzFHcb5KONAc4buKKv375Rd5iY8t/628zGes5NcpxKcv80lMCJ71qJ/hGErzFhWxb8dWCvPziK9dj9ys/XustY0qep6Qhn6QsoGaQCZQK/D9H1hrZwOzAVJSUmx6enpIC5TDKyj2kpVXzK4D+Xy74wDFXkuB10dRsY+vtmfRsFYsBcU+ftyTg9fnwxMVxUebdnN8/Xiy8ovZn1tIRbeDiDvCfUcaRzqc6ChDVJTBYwyeKP+/zLwiWjdMICu/iNaNalG7RgxRBqKMISrK/0ZjSr4PfDWB2z4LhV4fx9WrSYOEWBJrRAce8789HfrzB7/CwXMYY7DWEmUMdeJjDgapn/9nSo4veazknBzy/R9uHzzPH88BUCsu2v9aGIOJOvR3K/n+9/pEpGrk5OTQunVrasTGsHD+PIYNG4YxZsvRnKs6hv56oBfwHyAJWO1sOZGryOsjM6+IvEIve7ILyCv08sPubH7ck0N0lGFnVgGb9+ZQp2YMH27ac0zPtXlv7sHbNWKiqBnjIdoTRUyUochnOZBfROcWdYmJ9gfNrqwCTju+LjGeKGI8Uew8kE+nFnUC3/uP8UQZWtaLxxNlaFAr9uB9nkBQ/37bUDPGQ80YD1FRCi8RqR6KioqIiYkhISGBxx9/nNNPP51WrVod0zkdDX1jTF+gvbV2Zqm7FwBvGWPOBNoDaxwpLkIUeX38+ls+63/ex7tf72Td5v3kF3rJLfLiPYZu7+Pq1WRvdiHtm9embdPEg2G8P7eI9s1qExsdRZHXx3H14qldI5qEuGga1oojMXBbRCSSffHFFwwfPpwpU6ZwySWXMHTo0Eo5ryPvrtbaPoGvK4AVhzy2xRgzAH9rf7K11hv6Ct1jf04h3+/OJjO3iB/3ZLP6x31kbP2NAwXFFBb7gjpH8zo1iI2OYteBAs5o3YCsvCKObxBPl5Z1iTKGuvExNKoVR4NasZzQIIEYj5Z/EBE5GtZannrqKW6++Wbq1q1L/fr1K/X81bJJZa3dzu8z+OUI8gq97MzKZ9OubD7+fg97cwr5flc2W/bmkFsY3OelevExnNy4Fm2b1qZRYhz92jXmhAYJ1Izx4FF3t4hISOzbt48rr7ySl19+mcGDB7NgwQIaN25cqc9RLUNf/ujnvbms/G4XhV7Ll9sy2fhrFt/uPECsJ4qCIFvrTWrH0b11A46vH0/d+FiSWtbhxAYJ1E+I1SQsEZFqIC0tjddff51HHnmEm266iaioyu81VehXI5l5Rfxn/S9s2ZvDB9/tpkGtONZv2X/Y40sH/ilNalGnZgyprerTumEtateM4ZQmtWhZL16T00REqimv10tGRgbJyckMHTqUlJQUWrduXWXPp9B30IH8Ihas2syPe3LYtDObL7Zl/uHx0jPa42M9tGtWm26t6uOJMnQ+ri6nNKlFk9o1qBHjCXXpIiJyjLZt28aoUaNYvXo13377Lccff3yVBj4o9ENmT3YBG7bsZ9UPe/lqeybrNh++Bd++WW3G9jiR2jVjOL5+PMfVr0ntGjEhrFZERKrSG2+8wdixY8nLy2PWrFm0bNkyJM+r0K9Cv2bmMf/jzcz7eDOF3sOPvfdv14S+bRvT46QGnNjwaJaTERGRcGCt5eabb+bRRx+lS5cuLF68mFNPPTVkz6/Qr0RZ+UUsXvszq37Yy/vf7v6fx6MMnNe5Of3aNaZds9o0ToyjbnysA5WKiIgTjDF4PB5uuOEGHn74YWrUqBHS51foV4LNe3J48v3vWZL+S5mPX9ClOTf2P0WteBGRCGStZeHChbRp04YePXowffp0x66aUugfgy17c7j+hU/5/Jc/TsDrfUojRnY7np4nN9TqciIiEezAgQP89a9/5d///jejR4+mR48ejl4mrUSqIJ/P8unW/fx7zc+8vGHbwfs7NK/NhN4nMaRjU61IJyIipKenM3z4cH766Sfuu+8+7rzzTqdLUugHa/OeHG55KaPM6+YXXdGNXm0aOlCViIhUR2vXrqVXr140bdqUlStX0qtXL6dLAhT65Vr1wx7ue2MjG3/N+sP9LerW5Pq+J3PBaS10nbyIiADg8/mIioqia9euTJw4keuuu67S188/Fgr9w1j21Q5u/3+fsz+36OB9vU5uyCUpx3Fup2ZEqwtfRERKSUtL4+abb2bp0qU0b96cyZMnO13S/1Dol2Kt5dXPtvHIO9+x7be8g/c3r1OD6Zck0fNkdeGLiMgfFRUVMXnyZB5++GHatm1LVlYWzZs3d7qsMin0A/KLvHS85x2KS+0h37BWLK9c05OW9eMdrExERKqrn376iREjRrBmzRquvPJKHn30UeLjq29mKPSBT3/ez4VPrjr4fWx0FP8a1oXBHZtqBzoRETmsqVOn8s033/Diiy8ydOhQp8spl7HWln9UNZaSkmLT09OP6md9PsuYuWv56Ps9gH/FvIcv6swlKaFZA1lERMJPbm4u+/bt47jjjuO3335j//79tGrVKqQ1GGPWW2tTKvpzEd3S/8usVXy29TcAzunUlCl/6kDj2qFdElFERMLHF198wbBhw0hISGDNmjXUrVuXunXrOl1W0CJyCrrPZ/n7SxkHA3/iue14cmRXBb6IiJTJWsusWbM4/fTT2b9/Pw8++CBRUeEXoRHX0rfWMuKZ1az5aR8Atww4hfFnVu3+xSIiEr4yMzMZN24cr7zyCoMHD2bBggU0btzY6bKOSkSFfmZuERc9tYrvd2UT4zHc9+eODE893umyRESkGouNjWXLli088sgj3HTTTWHZwi8RUaF/9aL1fL8rG4DJ57VX4IuISJm8Xi8zZ87k8ssvJzExkTVr1hAdHf6RGf6/QZDe/uJXPvlxLwCzR3dlYIemDlckIiLV0S+//MKoUaNYuXIlNWrUYMKECa4IfIig0J/53vcAXHlmKwW+iIiU6b///S/jxo0jPz+f+fPnM2bMGKdLqlThOzBRAYvX/sxX27OIjY7ib/1PcbocERGphp544gnOP/98jj/+eNavX89ll13mugXaXN/SLyj2ct8bXwMwrueJ1Ipz/a8sIiJH4bzzzuPnn39m6tSpxMXFOV1OlXB9S39J+i/kFHqpXSOaOwa3dbocERGpJqy1zJ8/n2HDhuHz+TjhhBN4+OGHXRv44PLQ9/ks97/pb+Vf3LWl67ppRETk6GRlZTFq1CjGjRvHrl27yM7OdrqkkHB16K/8bjf5RT4Abuh3ssPViIhIdbBu3TqSk5N58cUXue+++0hLS6N27dpOlxUSrh7gXrR6CwA39D2ZuvGxDlcjIiJOKyoqYujQofh8PlauXEnPnj2dLimkXBv6mXlFLP9mFwDDtAiPiEhE2717N/Xq1SMmJoZXXnmFE044gXr16jldVsi5tnt/VWC73GZ1atCibk2HqxEREae8++67dOrUialTpwLQpUuXiAx8cHHov/PVDgD6tQvPTRFEROTYFBUVcccddzBo0CDq16/PJZdc4nRJjnNl9761lnWb9wPQr20Th6sREZFQ++mnnxgxYgRr1qzhyiuv5NFHHyU+Pt7pshznytDf+OsBtv2WB0DvUxo5XI2IiITa/v37+emnn1iyZIla+KW4snu/ZGOdfm0bExWla/NFRCJBTk4O//73vwFITk7mp59+UuAfwpWhXzKJL6llXYcrERGRUPj8889JSUlh9OjRfPXVVwDqzi+D60Lf57MHL9UbpN30RERczVrLk08+SWpqKr/99hvvvvsuHTp0cLqsast1Y/qf/fLbwdunNKnlYCUiIlLVxo4dy8KFCxkyZAjz58+ncWNdsXUkrgv9kq79v5zWQmvti4i43MCBA0lKSuLGG28kKsp1ndeVznWhv2mXf9OE01vVd7gSERGpbF6vl/vvv59mzZpx5ZVXMnLkSKdLCiuu+1i0bb//Ur0T6msCh4iIm/zyyy/069ePe+65h3Xr1jldTlhyXUv/+93+lv7xDRT6IiJu8frrrzNu3DgKCgpYsGABY8aMcbqksOSq0D+QX8RvuUXEeqK03r6IiEts3LiRCy64gC5durB48WJOOeUUp0sKW64K/e92HgDAZ60m8YmIhLnMzEzq1KlDu3bteOWVVxg8eDBxcXFOlxXWXDWm//O+XAD6t9N6+yIi4cpay/z58znhhBNYtWoVAH/+858V+JXAVaGfsTUTgKZ1ajhciYiIHI2srCxGjhzJuHHjOO200zjhhBOcLslVXBX6UYEu/WKfz+FKRESkotatW8dpp53GkiVLmDZtGmlpabRo0cLpslzFVWP6v2b6L9dLbdXA4UpERKSi3n33XYqLi1m5ciU9e/Z0uhxXclVLf2dWPgCNamncR0QkHOzcuZNPPvkEgNtvv52MjAwFfhVyVUt/d3YBAA1qxTpciYiIlGfZsmWMGTOG2NhYvv/+e2JjY6lbV7ujViVXtfT3HCgEoEmiJvKJiFRXRUVF3HHHHQwaNIgGDRrw5ptvEhurxloouKaln1NQTF6RlxiPIbGGa34tERFXycrKYuDAgaxZs4arrrqKf/7zn9r3PoRc09Lf9pt/El/zujWJitLCPCIi1VFiYiIdO3ZkyZIlPP300wr8EHNN6P8Q2F2vVpxa+SIi1UlOTg7XXnstmzZtwhjDs88+yyWXXOJ0WRHJNQmZV+QFINrjms8xIiJh7/PPP2fYsGF8++23dO7cmTZt2jhdUkRzTUKu27wPgNNaauaniIjTrLU88cQTpKamkpmZSVpaGhMmTHC6rIgX8tA3xswxxnxijJl4mMfrGWPeMsakG2OeDva8JavxxcW45nOMiEjYevrpp7nuuuvo168fGRkZ9O3b1+mShBCHvjHmL4DHWtsdaG2MKaufZzTwb2ttCpBojEkJ5twlLf1TmyRWVrkiIlJBBQX+9VIuu+wy5syZwxtvvEGjRo0crkpKhLpZ3AdYEri9DOhVxjF7gY7GmLpAS2BrMCdukOBfhS9GY/oiIiHn9Xq599576dKlCwcOHKBmzZpcfvnl2ua8mgl1QiYA2wK39wFl7YH7EXACcAOwMXDcHxhjrgp0/6fv3r0bgC+3+XfYO7lxrcqvWkREDuuXX36hb9++TJkyhZSUoDpnxSGhDv1soGbgdq3DPP89wNXW2qnAN8C4Qw+w1s621qZYa1NKuo1yA7P368VrVScRkVB57bXXSEpKYv369SxYsIDnnnuOxEQNs1ZXoQ799fzepZ8EbC7jmHpAJ2OMB+gG2GBOXLIeT934mGOtUUREguDz+Zg+fTonnHACGzZsYMyYMU6XJOUI9XX6rwIfGmOaA0OA4caYadba0jP5HwTm4e/i/wR4obyTHsgvoshriY2OIi5aY/oiIlXpm2++oUGDBjRq1IiXX36ZOnXqEBen3U3DQUgT0lqbhX8y32rgbGttxiGBj7V2rbW2g7W2lrV2gLU2u7zzlt5SV5NGRESqhrWWuXPn0rVrV26++WYAGjdurMAPIyFvFltr91trl1hrd1TWOfflFAG/b60rIiKVKzMzk0svvZQrrriCbt268fDDDztdkhwFV/SFlyzBq9X4REQq31dffUVycjIvvfQS06ZN491336V58+ZOlyVHwRVr7+cUFAOaxCciUhUaN25MkyZNeO655+jRo4fT5cgxcEVLvyT0E7TDnohIpdi5cye33XYbxcXFNGrUiI8//liB7wKuCP2f9+UCUDPG43AlIiLhb9myZXTu3JnHH3+cDRs2AGiStEu4IvRrBMJ+1wFN5BMROVqFhYXcdtttDBo0iEaNGrFu3TpSU1OdLksqkSv6w70+//o9bbQEr4jIURs3bhzPP/88EyZMYMaMGcTHxztdklQyV4R+YbEP+L3FLyIiwfN6vXg8Hm655Rb+8pe/cNFFFzldklQRd4S+1x/6sVqNT0QkaDk5Odxwww3ExsYya9YskpOTSU5OdrosqUKuSMmS2fvxsWrpi4gEIyMjg5SUFObNm0f9+vWxNqhtTiTMuSL0C0q696MV+iIiR2KtZebMmXTr1o3MzEzS0tK4//77NTs/Qrgi9L/dcQCAuBhX/DoiIlVm27Zt3HnnnfTr14+MjAz69u3rdEkSQq4Y0y9Zia9kQp+IiPzRl19+SYcOHTjuuONYu3Ytbdu2Ves+ArmiaewLjEU1rVPD4UpERKqX4uJipkyZQlJSEosWLQKgXbt2CvwI5YqW/nc7/bvv6pI9EZHfbd26lZEjR/Lhhx8yevRoLrjgAqdLEoe5IvRrBMbyo/TBVUQEgDfffJMxY8ZQUFDAwoULGT16tNMlSTXgitCP8fhDv05N7bInIlKiVatWvPDCC7Rp08bpUqSacMWY/v6cQgDidMmeiESwjRs3Mm/ePADOPfdc1qxZo8CXP3BH6OcWAVqRT0Qik7WWOXPmkJKSwt133012tn+ek8ejhpD8kStSMjHOP0pRUyvyiUiEyczMZMSIEYwfP54zzjiD9PR0atXS5mNSNleM6ReUrL3vccVnGBGRoBQUFJCamsoPP/zAAw88wG233abWvRyRK0K/KBD6MQp9EYkA1lqMMcTFxXHTTTfRuXNnevTo4XRZEgbCPiUtYK3/cj2PrtkTEZfbsWMHQ4YM4e233wbg6quvVuBL0MI/9AOr8fm0QZSIuNyyZctISkpi5cqV7Nmzx+lyJAy5IPT9X9XIFxG3Kiws5LbbbmPQoEE0atSI9PR0LbYjRyX8Qz/wtX5CnKN1iIhUlddee43p06dz9dVXs27dOjp06OB0SRKmwn4iX0n3fqxHTX0RcZeff/6Z448/nosvvpiPP/5YY/dyzMK+pV8ylh+l/n0RcYmcnBwuv/xyOnTowE8//YQxRoEvlcIFLX3/11/25zlbiIhIJfjss88YPnw43333HXfddRctW7Z0uiRxkbBv6ZeM6rdtmuhwHSIix2bmzJl069aNrKws0tLSmDZtGtHRYd82k2ok7EO/pKWva/RFJNx98cUXDBgwgIyMDPr27et0OeJCYf8RsmT2frRCX0TC0MqVK6lduzannXYajz/+ODExMRij9zOpGmHf0i+JfbX0RSScFBcXc88999C3b18mTpwIQGxsrAJfqlT4t/TVvS8iYWbr1q2MHDmSDz/8kDFjxjBz5kynS5IIEfah77Vq6YtI+Pjyyy8566yzKCoq4rnnnmPUqFFOlyQRJOy79w3+sN+0M9vhSkREyte2bVuGDRvGhg0bFPgScmEf+iVj+p2Oq+NwHSIiZdu4cSNDhgxhz549REdHM2vWLNq0aeN0WRKBwj70NXtfRKoray1z5swhJSWF9evX88MPPzhdkkS4sA99Du6yp9AXkeojMzOTESNGMH78eLp3705GRgbdunVzuiyJcGEf+gdb+tpwR0SqkVtvvZX//Oc/PPDAAyxbtoxmzZo5XZJI+M/et2rpi0g14fP5yMzMpF69etx///2MGzeO7t27O12WyEFhH/olbX2N6YuIk3bs2MGYMWPIzc3l/fffp1GjRjRq1MjpskT+IOy79wu9/tDX1roi4pR33nmHpKSkg4vteDwep0sSKVPYh35JC//nvbkOVyIikaawsJBbb72VwYMH07hxY9LT07nqqqu0lK5UW2Ef+iVj+u2a1Xa2EBGJOAUFBbz66qtcffXVrF27lg4dOjhdksgRhf2Yvi0Z09fsfREJkddee42BAweSmJjI+vXrqV1bjQ4JD65p6cd6wv5XEZFqLjs7m3HjxnHBBRfwxBNPACjwJayEfUu/0OsjDrX0RaRqffbZZwwbNoxNmzYxadIkbrzxRqdLEqmwsA99T2DCzM6sAocrERG3evHFFxkzZgwNGzZk+fLlnH322U6XJHJUwr9PPNDAb1G3prN1iIhrJScnc+GFF5KRkaHAl7AW/qFfMqYfHf6/iohUHytXruSGG27AWkubNm1YvHgxDRs2dLoskWMS9klZsva+R4vziEglKC4u5p577qFv374sXbqUvXv3Ol2SSKUJ+9Av4dFiGCJyjLZu3crZZ5/N1KlTGT16NBs2bFDrXlwl7CfyWatleEXk2Hm9Xvr378/27dtZtGgRI0eOdLokkUoX9qFfQlfsicjRyM/PJyYmBo/Hw+zZs2nRogUnn3yy02WJVImw797XmL6IHK2NGzeSmprK9OnTAejdu7cCX1wt/EM/kPrq3heRYFlrefbZZ+natSs7duwgKSnJ6ZJEQiLkoW+MmWOM+cQYM7Gc4540xvypvPMVFHsB8NlyDhQRATIzMxkxYgRXXnklPXr0ICMjgyFDhjhdlkhIhDT0jTF/ATzW2u5Aa2NMm8McdybQ1Fr73/LOWXJ9fn6htzJLFRGX+vrrr3n11Vd54IEHWLZsGc2aNXO6JJGQCXVLvw+wJHB7GdDr0AOMMTHAM8BmY8yfyz1joIXfMDG2kkoUEbfx+XysWLECgO7du7N582buvPNOoqLCfoRTpEJC/RefAGwL3N4HNCnjmDHA18A/gFRjzPWHHmCMucoYk26MSc8v8K+5H6Xr9EWkDL/++isDBw6kX79+rF+/HoCmTZs6XJWIM0Id+tlAySL5tQ7z/KcBs621O4BFwP8sdG2tnW2tTbHWpsTFxQEKfRH5X0uXLiUpKYlVq1bxzDPPkJyc7HRJIo4Kdeiv5/cu/SRgcxnHfA+0DtxOAbYc6YQls/d1yZ6IlDZx4kSGDBlC06ZNSU9PZ/z48Rg1DiTCHXPoG2OiAhPvgvEqMNoYMwMYCnxljJl2yDFzgLONMR8A1wCPBHNitfRFpLSWLVtyzTXXsGbNGtq3b+90OSLVQrkr8hljYoFbgIeAGtbavMD9NYBh+CfmvQPEl3cua22WMaYPMAD4R6ALP+OQYw4AlwT/K/ib+mrpi8jzzz+Px+Nh2LBhTJgwwelyRKqdYFr6UcCtwPXA5FL3LwLuwr+jfVGwT2it3W+tXRII/GN2cHEeZb5IxMrOzmbs2LGMHDmSBQsWHNyTQ0T+KJi19wuBHOAtIN0Y8wnQBv/ld12ttbnGGMcuki/yacMdkUj26aefMnz4cDZt2sSkSZOYPHmyxu5FDqPc0LfW+owxRdba740xNwE/A58Ca4E/G2OWHPkMVavkE31hsc/JMkTEAT/++CNnnHEGjRo1YsWKFfTp08fpkkSqtYrusrfDWvuZMeY04DGgPfBJ5ZcVvOjA4hq14lyzYaCIlKO4uJjo6Ghat27Nv/71Ly6++GLtey8ShKBn7xtjUoH/Z4wZjP9Suh+BndbadfjH9R3ib+nHeLSylkgkeP/99znllFP49NNPAbj66qsV+CJBOmJSGmPOMMa8Fvj2U2A6/svu9uGfYV8vcPldTWPMjMC/R40xT1Vp1aX8vrVuqJ5RRJxQXFzM5MmT6du3LzExMVpCV+QolNcn3hr/0rkxwCvAFOBv+K+lt0AWcBL+Dw+tAj/jAWpUQa1l+n1xHr0BiLjVzz//zMiRI/noo48YO3Ysjz/+OLVq1XK6LJGwc8TQt9Y+DzxvjPkFf8A/jD/s+wGv4b82/wpgk7X2wiqu9Yg8mq0r4lrz5s0jIyODRYsWMXLkSKfLEQlbwTaPC621lwL7gTpAPnAxUBs4gd972UOu5InV0Bdxl7y8PL7++msA7rrrLj7//HMFvsgxqmhUPgW0A/bi7/pPsdaur/SqKqDkkj2tyCfiHl9//TXdunVj4MCB5OXlERMTw4knnuh0WSJhr9zQN/5VLuKMMfWBxfjH9xPwX7LXuGrLK19B4Pp8de+LhD9rLbNnzyYlJYWdO3fy7LPPUrNmzfJ/UESCEszF7XH4x+4HAy9Ya78EMMaMARYaY3oAsVVX4pHFatq+iCvk5eVx2WWX8dJLL9G/f3+ee+457XsvUsmCScxi4Dr8rfw7Su601r4NPAr48H8wcETJmH5ctMepEkSkEsTFxVFQUMBDDz3EO++8o8AXqQLBLMNbDPw78G3OIY89GOj+71oFtVWIJvKJhB+fz8eMGTMYOnQoxx9/PK+++qrWzRepQsccldbv88oo5ugK8H+J0huFSFj59ddfGThwILfeeisLFiwAUOCLVLGgQt8YE2eMedkYExf4vqExprExJsEY4zXGJJQ6dqExpmdVFXwoi2bvi4Sbt99+m6SkJFatWsUzzzzDxIkTnS5JJCKUtwxvSZL6gD8HvgLMBd4BivCvu18QOL42MBxoXhXFHola+iLhYfHixZxzzjk0bdqU9PR0xo8frxa+SIiU19J/zRhzvrW2CMBaW2SMuRL/TP5brLWF/rttceD4MfgX8Hm1yio+xMHFefSeIVKtlaypce655zJ58mTWrFlD+/btHa5KJLIcNvSNMVH4N9l5IXB5HsaYlsD/AbdZa1cccnwN4EbgnpIPCSFxcO19pb5IdbVo0SJ69epFXl4eiYmJ3Hvvvbr+XsQBhw19a63PWnsP/t30RgfufgxYY619tIwfeRD4FZhd6VUewe/L8Cr0Raqb7Oxsxo4dy+jRo4mKiuLAgQNOlyQS0SR5KdUAACAASURBVIK5ZO8t4C1jjA+4HcgG/3i/9ffXGWPM/wEXAGdYa32HP1vl8wW6DDWmL1K9fPrppwwfPpzvv/+eyZMnM2nSJKKjg1kPTESqyhH/DzTGLAVyA99a4CEgKjCL/zdjTGrgsT8B3a21O6us0nJEq6UvUm1Ya7nmmmvIyclhxYoV9O7d2+mSRITyW/obCMzMx9+Sbwe8iH/Z3e3AKuBfwHHAZGPM30I6nl9KjJbjFXHcnj17iI6Opm7dujz//PMkJibSsGFDp8sSkYAjJqW19i5r7b34J++BfyvdWoH7Z1prH8ffA9AFOB14pkqrPQI19EWc9d5779G5c2euu+46AFq1aqXAF6lmgtll70EgDX+4nwmMNMZcV/oYa+13+K/jH2KMOb8qCj1yjVrJS8QpxcXFTJo0iX79+lG7dm3+/ve/O12SiBxGeYvz3AyMB/4GYK39ERgJPGiMaV1yWOCx7fjH/O+psmoPQ9vqijhj69at9O7dm2nTpjF27FjWr19Ply5dnC5LRA6jvJb+l8B5wFrwX7sfuD7/DeCRMo5fAHQ0xnSs1CrLocv1RJwRFRXFjh07eP7555k7dy4JCQnl/5CIOKa8Mf1l1to1+CfuGfxj+uBv0Z9vjDkV/GvzB47fh39BnwurrOIyqKUvEjp5eXk89thj+Hw+WrRowTfffMOIESOcLktEghDslHeLf5a+D8BamwGcAWwBVhLo4g94AVheiTWWSw19kdD46quvSE1N5W9/+xvvv/8+ADExMc4WJSJBCyr0rbWF1tqbrLVZpe5Lt9bmW2vPttbml7r/X9baVVVR7OGoe1+kallrmT17Nqeffjq7du1i6dKl9O3b1+myRKSCXHFxuyJfpGrddNNNTJgwgZ49e5KRkcGgQYOcLklEjkK5a2IaY6KBZtbarUEcexLwkLX2ksooLlhZ+cXlHyQiR+2SSy6hWbNm3HrrrURFuaKtIBKRglkIuzPwERBfcocxpinwFtCjdNc+UAv/trsh1SgxLtRPKeJqXq+Xhx9+mKysLB566CF69uxJz549nS5LRI5RMB/Z84FDl9YtApKAwkPuLyzj2CqnIX2RyrN9+3YGDhzI3XffzZYtW/D5QrqHlohUoWBC3xv4V1ox+LffPeR+R94dtMOeSOV46623SEpK4pNPPuHZZ5/l+eefV3e+iIu4Yp9LRb7Isdu1axcXX3wxbdq0YfHixbRr187pkkSkkrkj9NXSFzlqO3fupEmTJjRu3JilS5eSmppKjRo1nC5LRKpAsP12dYwxP5b8AzIAU/q+wP1pVVfq4an3UeToLFq0iJNPPpkXXngBgLPOOkuBL+Jiwbb084F7gziuOXDr0ZdzdDSmL1IxBw4c4LrrrmPhwoWceeaZ9OrVy+mSRCQEgg39AmvtgvIOCqzFH/LQV+SLBG/Dhg0MHz6cH374gSlTpnD33XcTHe2KkT4RKYcr/k9XS18keD/88AN5eXm89957nHXWWU6XIyIhVOHQN8aMB87kfy/jA6hzzBUdBWW+yJHt3r2b1atX86c//YlLLrmEc845R9vgikSgYELf8McJf/FAfQLX6h+iVmUUVVFq6Ysc3nvvvcfIkSPJyclhy5Yt1K1bV4EvEqGCCf0agX8AWGsfAx4r60BjTDsgpDvs+Z831M8oUv0VFxczZcoUHnjgAU455RTeeust6tat63RZIuKgckPfWvsZpUK/HLFAzWOq6CiopS/yR0VFRfTt25ePPvqIyy+/nMcee0ytexGpnK11jTGdjTEe4AugSWWcs4LPH+qnFKnWYmJiGDx4MM8//zxz5sxR4IsIEEToG2O6GWMOe1wg7D8FGgEeoFnllRecGI9CXyQvL49rrrmG999/H4C7776bESNGOFuUiFQrwbT0X+AI3fvWWi/+yX4FwCggLfBBIGRiPVqSTyLbV199RWpqKrNmzWLNmjVOlyMi1VQwE/kKgQJjzJTA92XtpGfxX8J3I/CfwAeBkNGYvkQqay3PPPMMN954I4mJiSxdupRBgwY5XZaIVFPBhH5JyP8N+BzoBawGzgA28fv1+p2Ak4C+lVxjuZT5Eqlef/11JkyYwIABA1i4cCFNmzZ1uiQRqcYq0i9ugYH4u/L/Evg6A5gauH0B8KK1dm9lF1ketfQl0hw4cACAP/3pTyxevJilS5cq8EWkXEczGG4D/w697yng/465oqOgzJdI4fV6uf/++znppJP4+eefiYqKYtiwYURpq0kRCcJhu/cDM/afwb/63ln4Z+YffLiMH9ltrc2q3PKCo5a+RILt27czatQo3nvvPUaMGEGdOo6sei0iYexIY/ox+LfKrQW8hX/hnWpJmS9u9+abbzJ27Fhyc3OZO3cuY8eO1foUIlJhh+0TtNYWWGuHAD/jD/7Mcs7V1hhzSWUWFyy19MXtFi9eTPPmzVm/fj3jxo1T4IvIUQl2lz17mK+lDQDGAi8dY00Vpvc/caNNmzbh8/k49dRTmTVrFtHR0dSoEeyK2CIi/yvY2T8m8G9N4Gta4P67gYcCt58BYo0xQyq1wiCopS9u89xzz5GcnMzVV18NQK1atRT4InLMKtLSnxa4Pf+Qxwz+Wfv5wD+BK4G3D3ciY8wcoD3wprV22hGOawIstdaeVl5xUcp8cYkDBw5w7bXX8txzz3HWWWexcOFCp0sSERcJJvRjgRrW2jIvxzP+wcX/wz+7fyFwjzEmxlpbVMaxfwE81truxpi5xpg21tpNh3neRwhyxz6Nb4ob/PTTTwwcOJAff/yRKVOmMHHiRDyekK5oLSIuF0zoP8Hvq+6VpQb+1n6ctXaHMaZvWYEf0AdYEri9DP/qfv8T+saYvkAOsCOI+tTSF1do3rw57dq1Y86cOZx11llOlyMiLlTumL619p/W2oIjPJ4HtAJ2Br7/9AinSwC2BW7vo4xteI0xscAk4I7DncQYc5UxJt0Ykw5wIL+4vF9DpFravXs3EyZMIDMzk7i4OF5//XUFvohUmUpZxstau8VaW9aM/kNl83uXfa3DPP8dwJPW2t+O8HyzrbUp1toUgMLisvYAEqneVqxYQVJSEvPnz2f16tVOlyMiESDUa3eux9+lD5AEbC7jmP7AtcaY94Euxphnyztpi3pBDf2LVAvFxcXcfffd9O/fn9q1a7N27VrtjCciIRHs7P3K8irwoTGmOTAEGG6MmWatnVhygLX2YN+mMeZ9a+348k7q0UQ+CSO33XYb//znP7n88st57LHHSEhIcLokEYkQIQ19a22WMaYP/oV8/mGt3QFkHOH4PsGcN0oz+SQMFBYWEhsbyy233EK3bt0YNmyY0yWJSIQJ+dZc1tr91tolgcCvFGrpS3WWm5vLhAkTOO+88/D5fLRo0UKBLyKOcMV+nNpVVKqrL7/8ktTUVGbPnk1ycjI+nyadiohzQj2mXyW0DK9UN9Zann76aW666Sbq1KnDsmXLGDBggNNliUiEc0Ub2aMxfalmsrOzeeCBB+jduzcZGRkKfBGpFtTSF6lE69evp1OnTiQmJvLxxx/TokULojT+JCLVhCvejXZnH3bBQJGQ8Hq93H///XTr1o3p06cD0LJlSwW+iFQrrmjp164R43QJEsG2b9/OqFGjeO+99xgxYgTXX3+90yWJiJTJFaGfWMMVv4aEoRUrVjBs2DByc3OZO3cuY8eO1a6PIlJtuSIt9RYrTmnUqBEnn3wy8+bNo23btk6XIyJyRO4YcFTqSwh99913PPjggwB06tSJVatWKfBFJCy4IvSNUl9CZOHChSQnJ/PII4+wfft2AHXni0jYcEfo6z1XqtiBAwcYPXo0l112GV27diUjI4PmzZs7XZaISIVoTF+kHNZa+vbty4YNG5gyZQoTJ07E4/E4XZaISIW5I/SV+lIFfD4fxhiMMUyaNIm6dety1llnlf+DIiLVlDu699XWl0q2a9cuzjvvPGbOnAnA+eefr8AXkbDnjtBX5kslWr58OUlJSaxYsYLY2FinyxERqTSuCH2RylBUVMRdd93FgAEDqFevHmvXrmXChAlOlyUiUmlcEfpq6EtlSE9P56GHHuKKK65g3bp1dO7c2emSREQqlSsm8ql/X47Fxo0badeuHd27dycjI4NOnTo5XZKISJVQS18iVm5uLhMmTKBjx46sWbMGQIEvIq7mipa+GvpSUV9++SXDhw/nq6++4vbbbyc5OdnpkkREqpw7Ql9tfamAZ599luuvv546deqwbNkyBgwY4HRJIiIh4Y7ufWW+VEBmZia9e/cmIyNDgS8iEcUdoe90AVLtffzxxyxduhSAm266ibfeeosmTZo4XJWISGi5I/SV+nIYXq+XadOm0bt3byZNmoS1lqioKKKiXPGnLyJSIa5459PWplKWbdu20b9/fyZNmsTQoUNZvny5/lZEJKK5YiKfyKG2bdtGUlISeXl5zJs3j8suu0yBLyIRzxWhr/dyKWGtxRhD8+bNue666xg+fDht27Z1uiwRkWrBHd37msonwHfffcdZZ53Fxo0bMcYwZcoUBb6ISCnuCH1lfkSz1rJgwQKSk5P5+uuv2b59u9MliYhUS+4IfacLEMccOHCA0aNHM3bsWFJSUvj888/p16+f02WJiFRL7gh9pX7E+uc//8kLL7zA1KlTWb58OS1atHC6JBGRassVE/kksvh8Pnbs2EHz5s25/fbbGTx4MKmpqU6XJSJS7bmjpa8O/oixa9cuzjvvPHr27El2djZxcXEKfBGRILmipa/u/ciwfPlyRo0axf79+5kxYwYJCQlOlyQiElZc0dL/NTPf6RKkChUXF3PXXXcxYMAA6tWrx9q1a7nmmmu02I6ISAW5IvSPq1fT6RKkChljWLVqFePHj2fdunV07tzZ6ZJERMKSK7r3xZ1efvllevToQdOmTVm6dCk1atRwuiQRkbDmipa+uEtubi5XXXUVF110EdOnTwdQ4IuIVAJXtPQ1suseX3zxBcOHD2fjxo3ccccdTJ061emSRERcwxWhL+6wdOlSLrzwQurUqcM777zDgAEDnC5JRMRV1L0v1UZqairDhw8nIyNDgS8iUgVcEfq6dCt8ffTRR1x88cUUFhZSv3595s2bR5MmTZwuS0TElVwR+hJ+vF4v9913H7179+azzz5j27ZtTpckIuJ6Cn0JuW3bttG/f38mT57M8OHD2bBhA61atXK6LBER13PFRD717oeXESNGsGHDBubPn8+YMWM0PCMiEiKuCH2p/goKCvB6vcTHx/PUU0/h8Xg49dRTnS5LRCSiqHtfqty3337LGWecwfXXXw9A+/btFfgiIg5Q6EuVsdYyf/58unbtytatW7nwwgudLklEJKK5IvQ1Ilz9ZGVlMWrUKMaNG8fpp59ORkYG5513ntNliYhENFeEvlQ/e/fuZenSpdx3332kpaXRokULp0sSEYl4msgnlcbn8/Hqq69y4YUX0qpVK3744Qfq1q3rdFkiIhLgjpa+Lvly3K5duzj33HO56KKLePPNNwEU+CIi1Yxa+nLM0tLSGD16NPv37+fJJ5/k3HPPdbokEREpgzta+uKYf/zjHwwcOJB69eqxbt06/vrXv2qxHRGRasoVoa+Icc5pp53G+PHjSU9Pp1OnTk6XIyIiR6DufamwJUuWsGXLFm699VYGDBigbXBFRMKEK1r6Eho5OTlceeWVDBs2jNdee43i4mKnSxIRkQoIeegbY+YYYz4xxkw8zON1jDFvG2OWGWNeMcbEln/Oyq9T/ujzzz8nJSWFOXPmcOedd/Lee+8RHa2OIhGRcBLS0DfG/AXwWGu7A62NMW3KOGwkMMNaOxDYAQwOZY3yv/bv30+vXr347bffePfdd3nggQeIiYlxuiwREamgUDfV+gBLAreXAb2ATaUPsNY+WerbRsCuQ09ijLkKuAogtunJVVGnAHl5edSsWZN69eqxYMECevbsSePGjZ0uS0REjlKou/cTgG2B2/uAJoc70BjTHahnrV196GPW2tnW2hRrbUrVlCkfffQRp556Kq+99hoAF154oQJfRCTMhTr0s4Gagdu1Dvf8xpj6wOPA5cGc1OiivUrj9XqZOnUqvXv3JjY2Vmvmi4i4SKhDfz3+Ln2AJGDzoQcEJu69BNxprd0SutLkl19+oV+/ftxzzz2MGDGCDRs2kJKizhQREbcIdei/Cow2xswAhgJfGWOmHXLMFUAycLcx5n1jzLAQ1xixVqxYQXp6OgsWLGDRokXUrl3b6ZJERKQSGWttaJ/QmHrAAOADa+2OYz1fXLM2dv5ryxmRevyxFxeBCgoK2LBhA927d8day6+//krz5s2dLktERI7AGLP+aOa1hfw6fWvtfmvtksoIfDk23377LWeccQYDBgxg9+7dGGMU+CIiLqYV+SKQtZb58+fTtWtXtm7dyuLFi2nUqJHTZYmISBVzRehr7n7wvF4vo0ePZty4cZx++ulkZGRw3nnnOV2WiIiEgCtCX4Ln8Xho3Lgx9913H2lpabokT0Qkgmjx9Ajg8/mYMWMGZ555Jt26dWPGjBlOlyQiIg5wRUtfG+4c3s6dOznnnHO49dZbeeGFF5wuR0REHKSWvostW7aMMWPGkJmZyaxZs5gwYYLTJYmIiIMU+i61fPlyBg0aRPv27UlLS6Njx45OlyQiIg5zRfe+/M7r9QLQp08fHnnkEdatW6fAFxERwCWhrw13/F588UXat2/Pjh078Hg83HLLLcTHxztdloiIVBOuCP1Il5OTw/jx4xk+fDj169enqKjI6ZJERKQaUuiHuc8//5yUlBTmzp3LXXfdxQcffEDLli2dLktERKohd0zki+De/QceeIDMzEzeffdd+vXr53Q5IiJSjbkj9CPMvn37yMnJoWXLljz55JN4vV6tnS8iIuVS936Y+fDDD+nSpQuXXnop1lrq16+vwBcRkaC4IvQjoXff6/UydepU+vTpQ1xcHI8++ihGSxGKiEgFqHs/DOzatYuhQ4eycuVKRo0axZNPPkliYqLTZYmISJhR6IeBhIQEcnNzWbBgAWPGjHG6HBERCVPu6N53YTd3fn4+06ZNIycnh4SEBFavXq3AFxGRY+KK0Hebb775hjPOOINJkybxxhtvABAVpf9UIiJybJQk1Yi1lrlz59K1a1e2bdvGG2+8wbBhw5wuS0REXEKhX41MmzaNK664gm7dupGRkcG5557rdEkiIuIirpjIF+4j+tZajDGMHDmS2NhY/v73v+PxeJwuS0REXEYtfQf5fD6mT5/O0KFDsdbSunVrbr/9dgW+iIhUCYW+Q3bu3Mk555zDbbfdhs/nIz8/3+mSRETE5VwR+uF2xd6yZctISkpi5cqVPPXUU/znP/+hZs2aTpclIiIu54ox/XCSm5vL2LFjadCgAWlpaXTs2NHpkkREJEIo9ENk69atNG/enPj4eN555x1OOukk4uPjnS5LREQiiLr3Q+DFF1+kY8eOPPzwwwB06tRJgS8iIiHnitCvrnJychg/fjzDhw+nQ4cOXHrppU6XJCIiEUyhX0W++OILUlJSmDt3LnfddRcrV67kxBNPdLosERGJYK4Y0zfVcHmevLw8cnNzSUtLo2/fvk6XIyIiopZ+Zdq7dy9z584FIDU1lU2bNinwRUSk2lDoV5IPPviALl268Ne//pXNmzcDEBsb62xRIiIipSj0j1FxcTFTpkzh7LPPpmbNmnzyyScauxcRkWrJHWP6Dg3pW2s5//zzefvttxk9ejRPPPEEiYmJzhQjIiJSDleEvlOMMVx66aWMGDGC0aNHO12OiIjIESn0Kyg/P59bb72V5ORkxo0bx6hRo5wuSUREJCga06+AjRs30q1bN2bOnMn333/vdDkiIiIVopZ+EKy1zJs3j+uvv574+HjefPNNzjnnHKfLEhERqRC19IOQnp7OFVdcQbdu3cjIyFDgi4hIWHJFS99U0fT93bt306hRI04//XSWLl1K//798Xg8VfJcIiIiVU0t/TL4fD7+8Y9/cOKJJ7Ju3ToABg0apMAXEZGw5oqWfmXauXMnY8aMYdmyZVx00UWcfPLJTpckIiJSKVzR0q+szv1ly5aRlJTEBx98wFNPPcVLL71EvXr1KunsIiIizlJLv5RPPvmEhg0bsnz5cjp06OB0OSIiIpXKFS39Y/Hjjz/y8ccfAzBx4kTWrVunwBcREVeK6NB/4YUX6NKlC+PHj8fr9eLxeKhZs6bTZYmIiFQJV4R+Ra/Yy8nJ4fLLL+fSSy+lU6dOLF26VDPzRUTE9SJuTH/37t2ceeaZfPfdd0ycOJF77rmH6OiIexlERCQCRVzaNWzYkLPPPptZs2Zx9tlnO12OiIhIyLije7+ci/b27t3LyJEj+fHHHzHGKPBFRCQiuSL0j2TlypUkJSXx0ksvHVxdT0REJBK5NvSLi4uZMmUKffv2JT4+ntWrVzNs2DCnyxIREXGMK0K/rNn7M2bM4N5772XUqFGsX7+e5OTk0BcmIiJSjbhuIl92dja1atXi2muv5aSTTuKiiy5yuiQREZFqwRUtfYD8/Hyuu+46UlNTycnJISEhQYEvIiJSSshD3xgzxxjziTFm4rEcU9rWHzfRrVs3nnjiCQYPHqzr7kVERMoQ0tA3xvwF8FhruwOtjTFtjuaY0ry5Wfxt+GC2b9/Om2++yYwZM4iLi6uaX0BERCSMhbql3wdYEri9DOh1lMcc5MvLpG3nrmRkZHDOOedUUpkiIiLuE+p+8ARgW+D2PqCsKfXlHmOMuQq4KvBtQcbaj75s0aJFJZcqh2gI7HG6CJfTa1z19BpXPb3GoXHq0fxQqEM/GyjZxq4WZfc0lHuMtXY2MBvAGJNurU2p/FKlNL3OVU+vcdXTa1z19BqHhjEm/Wh+LtTd++v5vbs+Cdh8lMeIiIhIBYW6pf8q8KExpjkwBBhujJlmrZ14hGPOCHGNIiIirhTSlr61Ngv/RL3VwNnW2oxDAr+sYzLLOe3sKihV/pde56qn17jq6TWuenqNQ+OoXmdjra3sQkRERKQacs2KfCIiInJkYRP6VbGSn/xRea+fMaaOMeZtY8wyY8wrxpjYUNfoBsH+nRpjmhhjPg1VXW5Sgdf4SWPMn0JVl5sE8X5RzxjzljEm3RjzdKjrc4vA+8CHR3g8xhjzX2PMx8aYy8s7X1iEflWs5Cd/FOTrNxKYYa0dCOwABoeyRjeo4N/pI/x++aoEKdjX2BhzJtDUWvvfkBboAkG+xqOBfwcu30s0xugyvgoyxtQDFuBfv+ZwrgfWW2t7AhcbYxKPdM6wCH2qYCU/+R99KOf1s9Y+aa19N/BtI2BXaEpzlT4E8XdqjOkL5OD/cCUV04dyXmNjTAzwDLDZGPPn0JXmGn0o/+94L9DRGFMXaAlsDU1pruIFhgFZRzimD7//t/gAOOKHq3AJ/UNX6WtylMfI4QX9+hljugP1rLWrQ1GYy5T7OgeGTSYBd4SwLjcJ5m95DPA18A8g1RhzfYhqc4tgXuOPgBOAG4CNgeOkAqy1WUFcwVah7AuX0K+UlfzkiIJ6/Ywx9YHHgXLHjqRMwbzOdwBPWmt/C1lV7hLMa3waMNtauwNYBJwdotrcIpjX+B7gamvtVOAbYFyIaos0Fcq+cAlGreRX9cp9/QIt0JeAO621W0JXmqsE83faH7jWGPM+0MUY82xoSnONYF7j74HWgdspgP6eKyaY17ge0MkY4wG6Abo+vGpUKPvC4jp9Y0xt4ENgOYGV/IBLSi/sU8YxZwTRLSIBQb7GfwUeADICd82y1r4Y6lrDWTCv8yHHv2+t7RO6CsNfkH/LicBc/F2hMcDF1tptZZxOyhDka5wKzMPfxf8JcKG1NtuBcsNeyftAYK5Pe2vtzFKPnQC8BaQBPfBnn/ew5wqH0IeDsxgHAB8EuuSO6hg5PL1+oaHXuerpNa56eo2rj8Cy9b2Ad8pr7IZN6IuIiMixCZcxfRERETlGCn0REZEIodAXkSpnjPEYY4zTdYhEOoW+iEsYYy4wxvQ4zGM1qnKvBGPMIGPMLaW+f9AY806pQyYD/w1cvhXM+UYGFoESkUoU7XQBIlJpJgErjDEz8F8XXeJO4ERghDHG4l/A41pr7dMAxpjTgHzKv47aA9QAvrDWFh7yWCZwlzGmsbX2dqAAyAuc/xzgNuDSQy8lCiyHGw0UWGt9pR66HMgF/lTqWA8QC/istQXl1CoiZVDoi7iAMeZ4oBNwPpAKnG2tfd8YMx9/oF4NXB049n38q3iVWI0/pEuHbiz+gC+95ndU4P5TCSxmY4yJAwywFjgX+FcZG37cDPzVWluyM2OUtTY/8NgwYCaQZ4wpCfIY/B9Aio0xm0udJwaIx78R0f1BvTAi8gcKfRF3uAz/TlvbAq358hxscVtr4w590BgzFphirT2xnPM8DPztkPsOflAoVUs/Y8y8wO3XgAsCt18IfF1qrd0T+JkXgLqBY7oA66y1vsBObufiXwZaRI6CxvRFwpwxJhoYj7+1XuK9QOBeBtQwxqQZYw4YY37Dv4jHkbbqrIgpQAMgxlprgJOBX4Hv8Id7O+B1/MMLUfh7D0aU+vmawBnAd8aYAcaY/wBN8a/bfhewEhgS2Cc8HWgWOIeIHAW19EXC3zj84/SlnW2tfb/kG2PMv/B33xfYMlbkMsb8Dci11j5TkScuvSlQYInQ5wP/DuDf1CYb/weML4FbrLWzD/n5bOA6Y8xsoBC4CH9Pwbv4PxBcaK19MzDv4DJr7asVqU9E/kgtfZEwFhjLfwh48jCP1zDGNMa/lewI4DJjzFhjTMdDDh0AnHXIfVHGmLql/jU0xjQr4zmSAl3y/wUetNbejH/sP85a+0vg3PcATxhj/huo51A5wG/45yX0xT9PYBTQwhiTjH9v9pN12Z/IsVHoi4S37fgDdf0h95d07+cBLYHpwEj84+QzgDaHHF9MqXH+gJbA/lL/dgNvlz7AGHM6sAH/NmRK4gAAAthJREFUBLsu1tp/larrN2OMx/rNwL8xy/Ec8r5jjBkCrAH64e8VeA3/7P3/BwzCvzHOifivQviPMSa+vBdFRMqm0BcJY9ba4tI7bpVydmCMvSb+UH4LmGmtvQB/N3p6EKffYq01Jf/wz54/dB2AL4EO1to/W2s3HfJYKqWuCLDWpgXuO3jlgDHmLmAh/p6Ijfh3Y0sEHsN/GWA3oAOQjH8L3M74Z/yLyFHQmL6ISwW6wku6w9OAwcaYz/GP3W+t6PmstcX4ewRKexvofYRed99hHjPGmChgMbDEWvt94M5u+PcDnwP8aK29MbBF61Zr7a/GmC6ADfQgHHb7UBEpm0JfxJ3eK3W7FfAy/lXxLPBEJT7POYFzHlxcxxhzKvAZsA34r7X2ppKDA9fpl1wi2An/sEShMebQxX4S8H9gGFvqZ+H3tQIG4Z/ZLyIVoNAXcaeSxXligGJrrTXGLMM/Vt60sp7EWptb+vvAvt7/xt9lfy+wKtDjcKe1Ni+wkl9h4GczOMx7kDHmVWCz/f/t3a1OxEAUhuHvC2lAkKyAZG8AsaAARzAIBB6LXhRkuQBugXAFeBRIEiQGJAk/ErcJ14A4iJmy0BAqdjGd90kqOplMp02a03ZmTiNGs+orAMb0ga6Y0+R+rurCiPiQtGj7VNKepEdJF7b7+Sc467ZXlZb89WwPbA+U1sNX9X7e1nL9lebBbS/ZPlF6w3+VdBwRY0lbSmPxT7aPbPf+7xIAaMObPtANC5okrfnKsJd/wHOjNCN+U2kW/rmkF6VJcQ/6mXf/vtFuc7/K7e3n9kdKSwE3JD1LOoyIq7pyHoffkTRUSuRzZvsyIg5azuf7QwyAGfEveToAdIjtfkS8N8qW67S3U7a9LWlX0nX+XP9X3XmlJYPjiLhrqXsr6S0ihtP2EcAEQR8AgELw+QwAgEIQ9AEAKARBHwCAQhD0AQAoBEEfAIBCEPQBACjEJ0uGzBfaOhg/AAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<Figure size 576x432 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "def plot_roc_curve(fpr, tpr, label=None):\n",
    "    plt.plot(fpr, tpr, linewidth=2, label=label)\n",
    "    plt.plot([0,1], [0, 1], 'k--')\n",
    "    plt.axis([0,1,0,1])\n",
    "    plt.xlabel('假正类率', fontsize = 16)\n",
    "    plt.ylabel('真正类率', fontsize = 16)\n",
    "    \n",
    "plt.figure(figsize=(8,6))\n",
    "plot_roc_curve(fpr, tpr)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 78,
   "metadata": {
    "collapsed": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.9873306524562505"
      ]
     },
     "execution_count": 78,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 计算曲线下面积AUC，虚线是随机分类0.5到1\n",
    "from sklearn.metrics import roc_auc_score\n",
    "\n",
    "roc_auc_score(y_train_7, y_scores)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "* 召回率TPR越高，分类器的假正类FPR就越多\n",
    "* 虚线表示纯随机分类器的ROC曲线，好的分类器应该远离这条线，向左上角\n",
    "* 是使用精度/召回率 PR曲线，还是使用ROC，关键在于 正类非常少或者更关注假正类而不是假负类，选择PR，反之ROC\n",
    "* 例如：前面例子ROC曲线很不错是因为跟负类 非5 相比， 正类 数据5 数量真的很少"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 训练随机森林分类器，比较SGD的ROC和ROC的AUC分数\n",
    "    获取训练集的每个实例分数\n",
    "    RandomForestClassifier 没有descision_function(),但是拥有dict_proda()方法，sklearn中分类器都有这两个中的一个\n",
    "    dict_proda返回一个矩阵，每行一个实例，每列代表一个类别的概率，比如这个图片 70%是5"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 81,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "from sklearn.ensemble import RandomForestClassifier\n",
    "forest_clf = RandomForestClassifier(n_estimators=10, random_state = 42)\n",
    "y_probas_forest = cross_val_predict(forest_clf, X_train, y_train_7, cv=3,\n",
    "                                   method = \"predict_proba\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 82,
   "metadata": {
    "collapsed": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[1. , 0. ],\n",
       "       [0.6, 0.4],\n",
       "       [1. , 0. ],\n",
       "       ...,\n",
       "       [0.1, 0.9],\n",
       "       [1. , 0. ],\n",
       "       [1. , 0. ]])"
      ]
     },
     "execution_count": 82,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y_probas_forest"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 83,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# 绘制ROC曲线， 需要决策值（不是概率）， 直接使用正类的概率作为决策值\n",
    "y_scores_forest = y_probas_forest[:,1]\n",
    "fpr_forest, tpr_forest, thresholds_forest = roc_curve(y_train_7, y_scores_forest)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 84,
   "metadata": {
    "collapsed": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0. , 0.4, 0. , ..., 0.9, 0. , 0. ])"
      ]
     },
     "execution_count": 84,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y_scores_forest"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 评估分类器"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 85,
   "metadata": {
    "collapsed": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0.86965, 0.87215, 0.86805])"
      ]
     },
     "execution_count": 85,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 使用交叉验证评估SGD的准确性\n",
    "cross_val_score(sgd_clf,X_train, y_train, cv = 3, scoring=\"accuracy\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 86,
   "metadata": {
    "collapsed": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0.9031, 0.8979, 0.9031])"
      ]
     },
     "execution_count": 86,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 缩放，标准化\n",
    "from sklearn.preprocessing import StandardScaler\n",
    "scaler = StandardScaler()\n",
    "X_train_scaled = scaler.fit_transform(X_train.astype(np.float64))\n",
    "cross_val_score(sgd_clf,X_train_scaled, y_train, cv = 3, scoring = \"accuracy\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 错误分析\n",
    "### 项目流程\n",
    "    探索数据准备选项\n",
    "    尝试多个模型\n",
    "    选择最佳模型并用GridSearchCV对参数进行微调\n",
    "    尽可能自动化"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 选择合适的模型，进一步优化，分析错误类型\n",
    "    查看混淆矩阵\n",
    "    使用cross_val_predict()进行预测\n",
    "    调用confusion——matrix"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 88,
   "metadata": {
    "collapsed": true
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\wjp\\anaconda3\\lib\\site-packages\\sklearn\\linear_model\\_stochastic_gradient.py:577: ConvergenceWarning: Maximum number of iteration reached before convergence. Consider increasing max_iter to improve the fit.\n",
      "  ConvergenceWarning)\n",
      "C:\\Users\\wjp\\anaconda3\\lib\\site-packages\\sklearn\\linear_model\\_stochastic_gradient.py:577: ConvergenceWarning: Maximum number of iteration reached before convergence. Consider increasing max_iter to improve the fit.\n",
      "  ConvergenceWarning)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "array([[5621,    1,   13,    7,    9,   49,   33,    9,  178,    3],\n",
       "       [   1, 6431,   44,   19,    4,   44,    4,    7,  173,   15],\n",
       "       [  26,   32, 5285,   84,   76,   29,   71,   39,  303,   13],\n",
       "       [  35,   21,  127, 5237,    2,  233,   26,   46,  336,   68],\n",
       "       [  11,   14,   46,   11, 5268,   14,   38,   21,  239,  180],\n",
       "       [  31,   23,   30,  156,   56, 4520,   79,   26,  433,   67],\n",
       "       [  33,   21,   50,    2,   43,   93, 5558,    5,  113,    0],\n",
       "       [  19,   15,   60,   29,   52,    9,    4, 5740,  126,  211],\n",
       "       [  16,   65,   39,  100,    3,  124,   31,    9, 5409,   55],\n",
       "       [  28,   20,   29,   59,  136,   32,    1,  176,  271, 5197]],\n",
       "      dtype=int64)"
      ]
     },
     "execution_count": 88,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y_train_pred = cross_val_predict(sgd_clf,X_train_scaled, y_train, cv = 2)\n",
    "conf_mx = confusion_matrix(y_train, y_train_pred)\n",
    "conf_mx"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 89,
   "metadata": {
    "collapsed": true
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 288x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 使用matplotlib.matshow查看混淆矩阵图像\n",
    "plt.matshow(conf_mx, cmap=plt.cm.gray)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 90,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# 大多数对角线图片较白，说明被正确分类\n",
    "row_sums = conf_mx.sum(axis = 1, keepdims = True) # 求和\n",
    "norm_conf_mx = conf_mx / row_sums # 错误率"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 92,
   "metadata": {
    "collapsed": true
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 288x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 用0填充对角线 ，只保留错误\n",
    "np.fill_diagonal(norm_conf_mx , 0)\n",
    "plt.matshow(norm_conf_mx, cmap = plt.cm.gray)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "    行代表实际类别，列代表预测类别\n",
    "    8，9列较两亮，说明许多图片错误分类为8,9\n",
    "    许多图片3错误分类为5"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 结论\n",
    "* 改进数字8和9的分类\n",
    "* 修正数字3和5的混淆"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 如何优化分类器\n",
    "* 尝试多收集这些数字的训练集\n",
    "* 开发一些新特征来改进分类器\n",
    "* 优化分类器算法\n",
    "* 使用pillow或opencv对图片预处理，让显示模型更突出\n",
    "* 分析单个错误"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 95,
   "metadata": {
    "collapsed": true
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 576x576 with 4 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "def plot_digits(instances, images_per_row = 10, **options):\n",
    "    size = 28\n",
    "    images_per_row = min(len(instances), images_per_row)\n",
    "    images = [instance.reshape(size,size) for instance in instances]\n",
    "    n_rows = (len(instances)-1) // images_per_row +1\n",
    "    row_images = []\n",
    "    n_empty = n_rows * images_per_row - len(instances)\n",
    "    images.append(np.zeros((size, size * n_empty)))\n",
    "    for row in range(n_rows):\n",
    "        rimages = images[row * images_per_row : (row+1) * images_per_row]\n",
    "        row_images.append(np.concatenate(rimages , axis=1))\n",
    "    image = np.concatenate(row_images, axis =0)\n",
    "    plt.imshow(image, cmap=matplotlib.cm.binary, **options)\n",
    "    plt.axis(\"off\")\n",
    "    \n",
    "# 查看数字3,5例子\n",
    "cl_a,  cl_b = 3, 5\n",
    "X_aa = X_train[(y_train == cl_a) & (y_train_pred == cl_a)]\n",
    "X_ab = X_train[(y_train == cl_a) & (y_train_pred == cl_b)]\n",
    "X_ba = X_train[(y_train == cl_b) & (y_train_pred == cl_a)]\n",
    "X_bb = X_train[(y_train == cl_b) & (y_train_pred == cl_b)]\n",
    "\n",
    "plt.figure(figsize=(8,8))\n",
    "plt.subplot(221);\n",
    "plot_digits(X_aa[:25], images_per_row=5)\n",
    "plt.subplot(222); \n",
    "plot_digits(X_ab[:25], images_per_row=5)\n",
    "plt.subplot(223);\n",
    "plot_digits(X_ba[:25], images_per_row=5)\n",
    "plt.subplot(224); \n",
    "plot_digits(X_bb[:25], images_per_row=5)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 94,
   "metadata": {
    "collapsed": true
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 576x576 with 4 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 96,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# 左侧两个是被分类为3的图片\n",
    "# 右侧两个是被分类为5的图片\n",
    "# 大多数错误分类的图片看起来还是非常明显的错误\n",
    "# 原因：SGD是一个线性模型，它所做就是为每个像素分配一个各个类别的权重，当它看到新的图像，将加权后的像素强度汇总，从而得到一个分数进行分类\n",
    "# 数字3和5在一部分像素位上有区别，所以分类器很容易将其弄混\n",
    "# 通过上面图像，如果书写3 的连接点左移，分类器可能将其分类为数字5，这个分类器对图像位移和旋转敏感\n",
    "# 减少混淆的方法之一，就是对图像进行预处理，确保位于中心位置并且没有旋转    "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 多标签分类"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 97,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# 为每个实例产生多个类别，例如 照片识别多个人脸\n",
    "# 分类器经训练可以识别小红， 小白， 小军 ，一张照片里有小红，小白\n",
    "# 经分类器， 输出【1,1,0】\n",
    "# 输出多个二元标签的分类系统称为多标签分类系统"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 98,
   "metadata": {
    "collapsed": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "KNeighborsClassifier()"
      ]
     },
     "execution_count": 98,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.neighbors import KNeighborsClassifier\n",
    "\n",
    "y_train_large = (y_train >=7)\n",
    "y_train_odd = (y_train % 2==1)\n",
    "y_multilabel = np.c_[y_train_large, y_train_odd]\n",
    "\n",
    "knn_clf = KNeighborsClassifier()\n",
    "knn_clf.fit(X_train, y_multilabel)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 99,
   "metadata": {
    "collapsed": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[False, False]])"
      ]
     },
     "execution_count": 99,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# knn支持多标签分类， 不是所有的分类器都支持\n",
    "knn_clf.predict([some_digit])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 101,
   "metadata": {
    "collapsed": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.9749934568236927"
      ]
     },
     "execution_count": 101,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y_train_knn_pred = cross_val_predict(knn_clf, X_train, y_multilabel, cv=2)\n",
    "f1_score(y_multilabel, y_train_knn_pred, average=\"macro\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 102,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# 上面假设了所有标签都同等重要，也可以给每个标签设置一个权重（该目标标签实例的数量），设置average='weighted'"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 多输出分类\n",
    "    例子子：构建一个系统去除图片中的噪声，输入一张噪声图片，输出一个去噪\n",
    "    数字图片，其输出是多标签（每个像素代表一个标签），每个标签值为0到255"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 103,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# 增加噪声，去噪\n",
    "noise = np.random.randint(0,255,(len(X_train),784))\n",
    "X_train_mod = X_train+noise\n",
    "noise = np.random.randint(0,255, (len(X_test),784))\n",
    "X_test_mod = X_test +noise\n",
    "y_train_mod = X_train\n",
    "y_test_mod = X_test"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 105,
   "metadata": {
    "collapsed": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.image.AxesImage at 0x2b2e31a91c8>"
      ]
     },
     "execution_count": 105,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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Iv7v1FyOSHqoXUvMtABHRCQy6rhFRCKjjltEJDLquEVEIpPy1WGVK1dGdnZ2sez222+ntWyj/dCS6jfeeMNkoaXa7JR2NiMEAHr27GmyY8eO0dqCggKThQ5dYAc37Ny502RZWVn08ewa2CnzAHD11VebbNWqVbS25HYEALBmzRpay2aFsJPqAaB69eome+CBB2jt7NmzTXb//ffT2mnTSo4nivzn0R23iEhk1HGLiERGHbeISGTUcYuIROa8+3GX+Qmc+wrAjsLfZgPYl9InvDAy9XUBcby2y733ad/xSW07ajG8rmC7TnnHXezJnMst7Yb3McjU1wVk9msrT5n6Pul1VUz6qEREJDLquEVEIpPujnt6mp8vXTL1dQGZ/drKU6a+T3pdFVBaP+MWEZGy00clIiKRUcctIhKZtHXczrkZzrk3nXOPpus5U8k519A5t7bw11Wccy8759Y55+690NeWLOdcbefcEufccufci865rEz7vqVCpr1HatsVX1o6bufcMACVvPddAbRyztETtGPhnKsLYDaAokMuHwSwwXvfHcBw59wlF+ziyuYuAJO99wMA7AZwBzLo+5YKatvRyKi2na477j4Aik6aXQ6gR5qeN1VOARgBIL/w931w9vWtARDlxH7v/VTv/YrC3zYAMBKZ9X1LhT7IrPdIbTsC6eq4awAo2nz6AAC78XZEvPf53vtD34sy6vU557oCqAsgDxn0ulIko773attxSFfHfQRAtcJf10zj86ZLxrw+51w9AFMA3IsMel0plOnvUca8vkxq2+m62A04+6NIBwDb0/S86ZIRr885lwVgHoCJ3vsdyJDXlWKZ/h5lxOvLtLad8qPLCi0AsNY51xjAIAA3pul502U2gMXOuZ4A2gJYf4GvJ1ljAXQCMMk5NwnALACjMvj7Vh7UtuOQUW07bSsnC0er+wNY4723hxdGrrAB9ACwrMRnhFHL9O9becj090htu+LRkncRkchE9YG8iIio4xYRiY46bhGRyKjjFhGJjDpuEZHI/D9im3Aqv0rxTQAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<Figure size 432x288 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "some_index = 4500\n",
    "plt.subplot(121);\n",
    "plt.imshow(X_test_mod[some_index].reshape(28,28),cmap = matplotlib.cm.binary)\n",
    "plt.subplot(122);\n",
    "plt.imshow(y_test_mod[some_index].reshape(28,28),cmap = matplotlib.cm.binary)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 106,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "knn_clf.fit(X_train_mod, y_train_mod)\n",
    "clean_digit = knn_clf.predict([X_test_mod[some_index]])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 107,
   "metadata": {
    "collapsed": true
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.imshow(clean_digit.reshape(28, 28), cmap = matplotlib.cm.binary)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "collapsed": true
   },
   "outputs": [
    {
     "ename": "NameError",
     "evalue": "name 'y' is not defined",
     "output_type": "error",
     "traceback": [
      "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[1;31mNameError\u001b[0m                                 Traceback (most recent call last)",
      "\u001b[1;32m<ipython-input-1-009b0f0896c5>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[0my\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;36m4500\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m",
      "\u001b[1;31mNameError\u001b[0m: name 'y' is not defined"
     ]
    }
   ],
   "source": [
    "y[4500]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 上下左右"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "train_size= 60000\n",
      "(300000, 784)\n",
      "(300000,)\n",
      "\n",
      "ps= [0.96340257 0.95450716 0.98216056 0.96442688 0.9762151  0.96528555\n",
      " 0.98130841 0.96108949 0.98809524 0.95626243] 0.9692753386570571\n",
      "\n",
      "psA= [0.97887324 0.95850974 0.98624754 0.97628458 0.97841727 0.9698324\n",
      " 0.98130841 0.96605238 0.99353448 0.96915423] 0.9758214273716403\n"
     ]
    }
   ],
   "source": [
    "# from sklearn.datasets import fetch_mldata\n",
    "import numpy as np\n",
    "from sklearn.neighbors import KNeighborsClassifier\n",
    "\n",
    "\n",
    "import scipy.io\n",
    "mnist = scipy.io.loadmat('mnist-original.mat')\n",
    "mnist\n",
    "\n",
    "X, y = mnist['data'], mnist['label']\n",
    "X = X.T\n",
    "y = y.T\n",
    "y = y.flatten()\n",
    "\n",
    "#print(X.shape)\n",
    "X_train = X[:60000]\n",
    "y_train = y[:60000]\n",
    "X_test = X[60000:]\n",
    "y_test = y[60000:]\n",
    "shuffle_index = np.random.permutation(60000)\n",
    "X_train, y_train = X_train[shuffle_index], y_train[shuffle_index]\n",
    "X_train, y_train = X_train[:60000], y_train[:60000]\n",
    "\n",
    "train_array = []\n",
    "train_size = X_train.shape[0]\n",
    "for i in range(train_size):\n",
    "#for i in range(122):\n",
    "    train_array.append(X_train[i].reshape(28, 28))\n",
    "    \n",
    "print('train_size=', train_size)\n",
    "\n",
    "def data_en(data_s, direc='u'):\n",
    "    size=len(data_s)\n",
    "    en_ret = np.zeros((size, 784))\n",
    "    if direc == 'u':        \n",
    "        for i in range(size):\n",
    "            trans_data = np.append(data_s[i][1:,:], data_s[i][0:1,:],axis=0)\n",
    "            #print(trans_data.shape)\n",
    "            en_ret[i] = trans_data.reshape(1, -1)\n",
    "    elif direc == 'd':\n",
    "        for i in range(size):\n",
    "            trans_data = np.append(data_s[i][-1:,:], data_s[i][:-1,:],axis=0)\n",
    "            #print(trans_data.shape)\n",
    "            en_ret[i] = trans_data.reshape(1, -1)\n",
    "    elif direc == 'l':\n",
    "        for i in range(size):\n",
    "            trans_data = np.append(data_s[i][:,1:], data_s[i][:,0:1],axis=1)\n",
    "            #print(trans_data.shape)\n",
    "            en_ret[i] = trans_data.reshape(1, -1)\n",
    "    elif direc == 'r':\n",
    "        for i in range(size):\n",
    "            trans_data = np.append(data_s[i][:,-1:], data_s[i][:,:-1],axis=1)\n",
    "            #plt.imshow(trans_data, cmap = matplotlib.cm.binary,interpolation=\"nearest\")\n",
    "            en_ret[i] = trans_data.reshape(1, -1)\n",
    "    return en_ret\n",
    "\n",
    "X_trainu = data_en(train_array, 'u')\n",
    "X_traind = data_en(train_array, 'd')\n",
    "X_trainl = data_en(train_array, 'l')\n",
    "X_trainr = data_en(train_array, 'r')\n",
    "\n",
    "#X_trainA = np.append(X_train, X_trainu, axis=0)\n",
    "X_trainA = np.concatenate((X_train, X_trainu, X_traind, X_trainl, X_trainr), axis=0)\n",
    "y_trainA = np.concatenate((y_train, y_train, y_train, y_train, y_train), axis=0)\n",
    "print(X_trainA.shape)\n",
    "print(y_trainA.shape)\n",
    "\n",
    "knn_clf = KNeighborsClassifier()\n",
    "knn_clf.fit(X_train, y_train)\n",
    "y_pred = knn_clf.predict(X_test)\n",
    "from sklearn.metrics import precision_score, recall_score,confusion_matrix\n",
    "ps = precision_score(y_test, y_pred, average=None)\n",
    "print('\\nps=', ps, np.average(ps))\n",
    "\n",
    "knn_clfA = KNeighborsClassifier()\n",
    "knn_clfA.fit(X_trainA, y_trainA)\n",
    "y_pred = knn_clfA.predict(X_test)\n",
    "psA = precision_score(y_test, y_pred, average=None)\n",
    "print('\\npsA=', psA, np.average(psA))      \n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "from sklearn.model_selection import GridSearchCV\n",
    "\n",
    "param_grid = [\n",
    "    {'n_estimators': [3, 10, 30], 'max_features': [2, 4, 6, 8]},\n",
    "    {'bootstrap': [False], 'n_estimators': [3, 10], 'max_features': [2, 3, 4]},\n",
    "  ]\n",
    "\n",
    "forest_reg = RandomForestRegressor(random_state=42)\n",
    "grid_search = GridSearchCV(forest_reg, param_grid, cv=5,\n",
    "                           scoring='neg_mean_squared_error', return_train_score=True)\n",
    "grid_search.fit(housing_prepared, housing_labels)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "import time\n",
    "a=time.time()\n",
    "mnist=fetch_openml('mnist_784',version=1,cache=True)\n",
    "mnist.target=mnist.target.astype(np.int8)\n",
    "sort_by_target(mnist)\n",
    "b=time.time()\n",
    "print(b-a)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.datasets import fetch_openml"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<function sklearn.datasets._openml.fetch_openml(name: Union[str, NoneType] = None, *, version: Union[str, int] = 'active', data_id: Union[int, NoneType] = None, data_home: Union[str, NoneType] = None, target_column: Union[str, List, NoneType] = 'default-target', cache: bool = True, return_X_y: bool = False, as_frame: Union[str, bool] = 'auto')>"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "fetch_openml"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\wjp\\anaconda3\\lib\\importlib\\_bootstrap.py:219: RuntimeWarning: numpy.ufunc size changed, may indicate binary incompatibility. Expected 192 from C header, got 216 from PyObject\n",
      "  return f(*args, **kwds)\n"
     ]
    }
   ],
   "source": [
    "from sklearn.datasets import fetch_openml\n",
    "mnist = fetch_openml(\"mnist_784\",data_home='./')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "90.5908579826355\n"
     ]
    }
   ],
   "source": [
    "import time\n",
    "a=time.time()\n",
    "mnist=fetch_openml('mnist_784',data_home='./',version=1,cache=True)\n",
    "mnist.target=mnist.target.astype(np.int8)\n",
    "# sort_by_target(mnist)\n",
    "b=time.time()\n",
    "print(b-a)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
